Wanna be Brilliant Full-Stack Developer

자바 버퍼(Stream)이란? 본문

Some Memos/Java

자바 버퍼(Stream)이란?

Flashpacker 2023. 4. 6. 23:20


버퍼는 무엇인가? 버퍼라는게 조금 생소할 수 있다.

Buffer를 정의하자면 임시 저장공간이라 할 수 있다.

A라는 창고가 있고 B라는 창고가 있는데 여기에서 창고에서 창고로 쌀을 보낼것이다.

쌀을 보낼건데 기존에 있는 쌀로 B창고가 가득차 있으면 쌀을 담을 수가 없다.

그래서 쌀을 어떻게 넣어놔야하는가? 잠깐 어딘가에 보관을 임시로 해야한다.

임시로 쌀을 보관하는 부분이 Buffer라고 한다.

버퍼에다가 넣어놨다가 쌀이 소비가 되면 이제 자리가 나니까 그곳으로 들어간다.

 

버퍼라는걸 배우기 위해서는 통신에 대한 아주 간단한 개념을 알아야한다.

Steam에 대한 개념을 잡아보자!

Steam이라는건 수도꼭지라 생각하면 된다. 

수도 꼭지가 있으면 물이 떨어지는데 어디를 따라 흘러가는가?

수도관을 타고 물이 흘러간다.

그리고 어떤 목적지에 도착을 하게되는데 

내가 수도꼭지를 여는 순간 물이 쭉 흘러가는 물의 흐름이 있다.

그 물의 흐름이 Stream이라고 한다.

그래서 물의 흐름을 프로그램에서는 전류의 흐름이라고 한다.

 

컴퓨터가 있다!

외부입력장치를 키보드를 하나 들고 있다.

내가 키보드에다가 타이핑을 a를 치고 엔터를 치는 순간 컴퓨터가 선이 연결이 되어있어야지

A라는 데이터를 전송할 수가 있다.

A를 전송하려면 

저 선이 Stream이 되어야한다.  스트림을 통해서 a라는 문자가 흘러들어가는데

어떤식으로 흘러가게 되냐면 A = 를 부호라고 한다. 

숫자로 변형해놓은 코드가 있는데 65라고 한다.

B는 66이라고 한다 C는 67 

실제로 A를 전송한다는 것은 스트림을 통해서 65를 전송한다는 것이다.

 

키보드가 컴퓨터쪽으로 전송하는거니까 키보드가 컴퓨터쪽으로 집어넣는것이다.

컴퓨터 입장에서 보면 데이터가 안쪽으로 들어오는것이다.

컴퓨터 입장에서는 65라는 데이터가 들어오니까 Input이라고 한다.

컴퓨터 입장에서 Stream이 연결되어서 모니터 화면에 출력하려면 

컴퓨터가 모니터 쪽으로 데이터를 던지는거니까 전송하는 데이터가 65니까 

이거는 개념이 조금 달라진다.

65라는 데이터를 Output한다고 한다.

컴퓨터를 데이터를 받아들이고 바깥으로 출력하고를 

입력, 출력이라고 한다.

이 두가지를 줄여서 I/O라고 한다.

 

그러면 이제 65를 키보드가 컴퓨터한테 전송하려면 65를 들어오면 A가 들어온것이다.

아스키코드 표를 보고 분석할 수 있다.

65를 어떻게 보내는가? 

2진수와 10진수의 차이는 하나의 박스안에 숫자가 몇개가 들어올 수 있는가이다.

2진수는 한박스에 0과 1이고

10진수는 하나의 박스에 0부터 9까지 들어간다.

 

2가지를 표현할 수있는 2진수를 알아야하는 이유는?

키보드가 컴퓨터한테 데이터를 보낼때 전류를 흘리는걸 1이라고 하고 안흘리는걸 0이라고 해서

둘다 전류를 흐르지 않으면 0,0 이되고 박스가 두개 있을때 하나는 전류가 안흐르고 하나는 흐르면 0과 1이 된다.

 

그러면 애를 숫자로 표현할때는 1과 0은 첫번쨰 자리가 0이니까 애가 나올 수 있는 경우의 수는 0아니면 1이니까  0이되고

1이 나온거는 2의 1승과 + 0을 한다.

 

1, 1, 1 은 무엇인가? 제일 첫번쨰 자리는 1이고, 두번쨰 자리는 2의 1승, 세번쨰 자리는 2이 2승

다 더하면 7이다.

이렇게 해서 전류를 흘러보내는데 65를 보낸다는것은?

Stream은 8비트씩 데이터를 끊어 읽으며 흘러간다.

8비트는 박스가 8개가 있다는 것이다.

박스가 8개 있으니까 8개의 박스가 65를 표현해보자

2의 6승이면 64이다. 그러면 0100001이렇게 될것이다. 

애가 날라가면 컴퓨터에서 이걸 받고 컴퓨터에서 아스키코드표를 보고 애를 부호화 시켜서 A로 번역을 한다.

이런식으로 통신을 한다.

이 수도관을 통해서 0,1,0,0,0,0,0,1 이런식으로 데이터가 흘러가서 2진수로 흘러가서 A로 부호화하는 방식으로 통신을 한다.

1바이트가 8비트라는것은 컴퓨터의 기본 개념이다.

 

이 개념에 대해서 잘 알아보기 위해서는 이 밑에 포스팅을 보는것을 추천한다!

https://barnabas-kim8618.tistory.com/113 

 

그럼 정리를 해보자!

A와 B가 서로 통신을 할때 머가 만들어지는가? 선이 만들어지는데

그 선은 Stream이라고 한다. 이 스트림은 데이터를 바이트 단위로 이동을 한다.

바이트 단위로 이동한다는것은 8비트 단위로 왔다갔다 움직이는것이다.

데이터를 보낼때 A를 보낸다면 A가 실제로 날라가는것이 아니라 01000001 이런식으로 날라가면

B가 받으면 아스키코드 표를 통해 부호화 하는 과정이 필요하다.

 

Stream으로 데이터를 보내면 문자를 하나씩 전송하는 실습을 한번 해보자!

Java.io 가 들고 있는 inputStream이라는것 이 있다.

System.in이 무엇인가? 키보드에 연결된 Stream이다.

in이 스트림이다.

키보드가 있고 컴퓨터가 있으면 System.in이라는걸 통해서 연결을 시키고

in이라고 하니까 Input 선이 컴퓨터에게 달린다.

이 선이 바이트가 왔다갔다 거리는 스트림 선이다. 

그래서 이걸 바이트 스트림이라고 한다.

 

이 연결된 선을 변수 in이라고 적어놨다. 이 in을 통해서 in.read()라고 해서 읽으려고 하는데 오류가난다.

컴파일 예외 처리를 해줘야한다! IoException이 발생한다? 그것이 무엇인가? 

키보드를 통해 문자가 들어오고 있는 사이 키보드선이 가위로 짤린다던지

무슨일이 일어나서 데이터가 제대로 안들어올 수 있다.

이건 컴파일시에 잡을 수 있는 에러니까 Exception으로 바꿔서 잡을 수 있다.

read하면 멀 읽는가? int를 읽으니까 스트림으로부터 전송되는것은 

내가 A를 보낸다는것은 01000001이라고 보내는것인데 

내가 코드를 in.read()는 무엇을 하는가? 이 2진수를 10진수로 변환을 해서 읽어준다.

엄청 좋다!?

내가 앞으로 int를 받아야한다.

한번 받아보자! 

그리고 받은 data를 출력해보자!

근데 12번라인에서 출력이 멈춘다? 왜멈추는가

키보드로부터 입력을 받을떄까지 멈춘다.

A를 입력하면 이 A가 전송을 하는데  순서가 첫번쨰로 키보드가 A를 적고 실제로는 바이트 스트림을 탈때는 

01000001로 변환해서 보내고 

다시 10진수로 반환해서 읽는다 이것이 과정이다.

내가 제일처음 보낸 데이터는 인코딩전 데이터라고 한다.

정상적인 데이터라는 것이다. 통신을 통해서 보내기 위해서는 010000001 같은 데이터는 인코딩된 데이터라고 한다.

인코딩이라는것은? 무슨 뜻인가? 

문자나 기호들을 컴퓨터가 이용할  수 있는 신호로 만드는것을 인코딩이라고 한다.

근데 이거를 다시 10진수로 변환을 해서 65로 읽어줬다는것은 무슨말인가?

read()함수는 디코딩을 하는데? 디코딩이라는것은 다시 인간이 이해할 수 있는 10진수 세계로 해준다는것인데

 

인코딩과 디코딩이 된것이다.

통신은 항상 무엇이 들어가는가? 인코딩과 디코딩이 들어간다.

꼭 기억해야한다! 

그러면 A라는 데이터가 키보드로부터 컴퓨터에게 흘러들어갈떄 인코딩이 되어서 흘러들어간다.

컴퓨터가 이해가 돌 수 있는 상태로 들어가고 

컴퓨터가 이 데이터를 받아서 인간이 이해할 수있게 디코딩해서 65라고 찍힐것이다.

디코딩은 부호화까지 하지 않고 디코딩은 정수화까지만 한다.

 

 

그래서 로직은 키보드는 A를 인코딩해서 0100000으로 컴퓨터에게 전송한다.

바이트 스트림을 통해서 흘러들어간다. input이 되는것이다.

3번은 바이트 스트림을 통해서 인풋을 통해 흘러들어온것을 read()라는 메서드로 0100000을 65로 디코딩 한다. 이 디코딩된 데이터 65를 char로 캐스팅하면? 어떻게 되는가? 

 

키보드로부터 A를 입력받으면 마지막 부호화까지 해줬기 때문에 A가 나온다. 

 

마지막 네번째는 65를 문자로 부호화시킨다.

이렇게까지 진행된것이 디코딩이다.

이것의 단점은 ABC라고 입력하면 바이트 스트림이기 때문에 한번에 1바이트씩만된다.

더 많이 보내도 더많이 받지를 못한다.

'Some Memos > Java' 카테고리의 다른 글

JAVA 소켓통신의 개념 #1  (0) 2023.04.13
Java BufferedReader란?  (0) 2023.04.13
자바 StringConstantPool 이란?  (0) 2023.04.04
자바 예외처리( 컴파일, 런타임)  (0) 2023.03.28
자바 동기와 비동기가 무엇인가?  (0) 2023.03.28