[Java] BufferedReader, InputStreamReader 의미

Minji·2023년 3월 19일
0

문자 인코딩

아스키 코드

  • 7bit가 만들어 낼 수 있는 이진수 조합을 문자와 대응한 것
  • 2^7 = 128가지의 표현이 가능하다.
  • 세계 각국의 문자 표현은 불가능

유니코드

UCS-2(문자표)

  • 16bit 고정폭으로 문자 표현
  • 2^16 = 65536가지의 표현이 가능하다.
  • 전 세계 문자를 담기엔 아직도 부족함
  • 32bit로 늘리려고 했으나 하나의 문자를 표현하기엔 메모리를 너무 많이 차지함

인코딩 ? 문자표가 더 이상 수용하지 못하는 문자들을 수용하기 위한 여러가지 시도들

UTF-16

  • 16bit 유지하는 대신 언어판을 17개로 늘린 것
  • 2^16 * 17가지의 문자 표현이 가능
  • BMP(기본언어판) : 가장 맨 앞에 위치, 가장 자주 사용하는 것
  • 16bit를 고정적으로 사용하기 때문에 영어,숫자 표현할 때 메모리 공간 비효율적
  • 한글은 2byte차지
  • Java의 JVM은 문자열을 메모리에 저장할 떄 해당 인코딩 방식을 사용

UTF-8

  • 7bit 표현 가능한 문자를 7bit로 표현
  • 한글은 3byte차지

JVM의 인코딩 방식

  • UTF-16을 사용
  • 다양한 문자가 사용되는 공간이면 메모리 효율과 UTF-8 임의 접근에 비효율적이기 때문
    - UTF-8인코딩은 헤더규칙을 고려하고 유니코드 문자표로 접근할 수 있음
    • UTF-16은 바로 접근 가능

Stream

  • 문자 --인코딩--> 이진수
  • 데이터 = 이진수의 나열
  • 스트림 = 이진수의 흐름
  • 바이트 단위로 이진수의 흐름을 읽어들임
  • UTF-16인코딩 방식으로 바꾸는 것을 InputStreamReader가 한다.

스트림의 종류

InputStream, OutputStream을 쓰면 바이트 스트림
Reader, Writer 쓰면 문자 스트림
System.in, System.out 은 Stream객체이고 기반스트림이다.
BufferedInputStream, BufferedOutputStream 은 보조스트림이고 입출력 속도 향상 때문에 쓴다.
입출력 속도 향상?
BufferedInputStream은 기반 스트림이 읽어 온 스트림 데이터를 내부버퍼에 저장한다. 입력버퍼에서 데이터를 받아야하는데, 프로그램 입출력 속도와 입력버퍼의 입출력 속도는 다르다. 그래서 둘 사이에 완충지대로 내부 버퍼를 놓는다면 입출력에 지연이 생겨도 내부 버퍼 안에 데이터가 미리 대기하고 있어서 지연 발생 없이 속도가 향상된다.
프로그램<-내부버퍼(BufferedInputStream)<-입력버퍼(기반스트림)

InputStreamReader

Java 레퍼런스를 참고해보면, 다음과 같이 쓰여있다.

  • byte stream에서 character stream으로 바꾸기 위한 다리 역할
  • bytes를 읽고 정의된 charset을 사용해서 character로 디코드한다.

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
는 효율성 top.

참고

profile
매일매일 성장하기 : )

0개의 댓글