Wanna be Brilliant Full-Stack Developer
Java BufferedReader란? 본문
A와 B가 있는데 바이트 스트림을 연결하고 데이터를 보낼텐데 문자를 하나밖에 못보낸다.
문자를 보내도 65로 데이터를 A를 전송하게 되면 실제로 A라는 데이터가 인코딩 되어서
01000000 으로 흘러가고 B는 이 데이터를 받을떄 디코딩해서 65로 바꿨다!
지난번에 여기까지 했다.
그러면 우리가 65를 문자로 캐스팅을 했는데 이것보다 더 편한 방법이 무엇인가?
65를 A로 부호화시켜주는 역할을 InputStreamReader이다.
단점이 무엇인가? 내가 지금 바이트 스트림을 InputStream이라고 안하고
InputStreamReader라는 애를 쓰게 되면 아까와 는 다르게 65를 자동으로 캐스팅 하지않아도 A로 바꿔주는것은
너무 좋은데 그 단점이 무엇인가? 데이터를 가변적으로 받지 못한다.
내가 어느때는 가나다를 보내고 싶을때 있다.
이런 데이터를 전송 못한다. 문자열로 바꿔주는 역할만 할뿐이다.
이게 무슨말인지 한번 이해를 해보자!
여기까지 똑같이 A를 치면 65가 나온다.
배열을 하나 만들어서
그러면 문자로 받는다! 아까전에는 먼가 캐스팅을 해야했는데 지금은 캐스팅 없이 받을 수 있다.
그러면 문자 두개를 받고 싶다고 하면 될까?
하나밖에 못받는다!
근데 세칸으로 바꾸면 여러개도 받을 수있게된다.
ABC를 작성하면 65, 66 ,67 을 받게 된다. 이걸 받을 수 있는 배열 하나를 만들어 놓자!
세개짜리를 하나 만들어서 하나씩 배열에 담긴다.
애를 캐스팅 까지 해서 담아준다. 좋은데 같은데 단점이 무엇인가?
애가 문자를 100개를 보내고 싶다고 하면? 100개짜리 배열을 만들어야한다?
내가 문자 한개를 보내고 싶은데 한개짜리 배열을 만들면 된다.
근데 미리 코드를 작업할때 내가 머가 들어올줄 알고 이거를 한개로 만들지
천개를 만들지 미리 알 수가 없어서 작업을 할 수 없다.
그래서 내가 크기를 미리 1000으로 잡아 놓으면 내가 데이터 하나만 보내면
999개가 낭비 되는것이다. A부터를 하면 문자를 500개를 보면
매주 500개의 자리는 낭비하게된다.
단점은 쓸데없이 크게만들어서 낭비하게 만든다는것이다.
그래서 이 두가지 단점을 해결한것이 BufferdReader라는것이다.
어떤 단점을 해결하는가?
첫번째 숫자를 부호화 시키는것
문자를 가변적으로 받을 수 있다! 그래서 배열의 공간 낭비가 없게 된다.
모든 통신은 BufferedReader이다.
BUffer에대한 개념이 굉장히 중요하다!
Buffer을 한번 달아보자!
이 br은 엄청나게 매력적인게 무엇인가하면? Try Catch를 하면
String으로 받을 수 있다.
이게 왜가능한가? 이 버퍼의 원인은 굉장히 간단하다!
이 Buffer는 임시 저장 장치라고 헀던거 기억나는가?
양쪽으로 임시 저장장치를 만들어서 만약에 세칸이라고 한다면?!
세칸 씩 있는데 내가 이제 둘이 통신을 해야하니까 바이트 스트림을 연결해야한다!
그리고 바이트 스트림은 이름이 무엇이 되는가?
바이트가 흐르는 공간은 동일하는데 이게 변수 br이 된다.
그러면 데이터를 어떻게 보내는가? Hello라는 메시지를 보낼꺼면
Buffer라는 애를 쓴다면 Hel 이렇게 들어가는데
Buffer의 특징 첫번째!
양 끝단에 버퍼의크기를 맞춘다! 둘다 세칸짜리이다.
두번째! 버퍼가 가득차면 자동 전송된다.
이게 머냐면 flush라고 한다. 지금 버퍼가 가득찼는가? 찼다!
자동으로 흘러간다 Hel이 자동으로 2진수로 바뀌어서 전송된다.
전송되서 이렇게 흘러가면 Hel을 B가 받는다.
그럼 A의 버퍼는 flush가 되어서 없어지고 아까젼에 안들어왔던 LO가 들어온다!
그럼 버퍼 특징 세번째는 전송된 후 버퍼가 비워지고 그 자리에 나머지 데이터가 갱신이 된다.
이 상태에서 내가 만약 버퍼 가 가득찼다고 하면 Lo 다음에 W가 가득찼다고 하면
전송이 바로 안된다.
자동 전송의 조건이 있는데 상대 버퍼가 비어져 있어야한다.
지금 상대 버퍼가 비어져있는가? 아니다 가득차 있다.
B의 버퍼는 br.readLine이라는 메서드를 사용하면 여기에 있는게 비어져서 string data에 들어온다!
readLine이라는 메서드를 쓰고 저기에 담는데
이게 무엇인가? 전송받은 데이터를 비우는것이다!
저게 비어지는 순간 low가 들어오고 그 다음에 A의 버퍼도 비어지고 orl이 들어온다
이런방식으로 들어오는것이 버퍼이다.
버퍼로 데이터를 전송하게 되면 가변길이의 데이터를 계속 전송할 수 있다.
지금 이 코드를 보면 readLine이 무엇을하는가? 전송받는 데이터를 불러들인다.
키보드로 HelloWorld라고 엔터를 치는 순간 데이터를 전송하는데
버퍼의 사이즈가 3이니까 Hel만 처음에 올라가고 그다음에 전송되고
readLine으로 비어두면 low가 들어고 다시 전송되고 비어지고
이런게 반복되는것이 BufferedReader이다.
키보드로부터 받는 데이터를 읽는데 BufferedReader로 읽는다!
'Some Memos > Java' 카테고리의 다른 글
Java 소켓통신 #2 (0) | 2023.04.19 |
---|---|
JAVA 소켓통신의 개념 #1 (0) | 2023.04.13 |
자바 버퍼(Stream)이란? (0) | 2023.04.06 |
자바 StringConstantPool 이란? (0) | 2023.04.04 |
자바 예외처리( 컴파일, 런타임) (0) | 2023.03.28 |