문자 인코딩
아스키 코드
- 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인코딩은 헤더규칙을 고려하고 유니코드 문자표로 접근할 수 있음
Stream
- 문자 --인코딩--> 이진수
- 데이터 = 이진수의 나열
- 스트림 = 이진수의 흐름
- 바이트 단위로 이진수의 흐름을 읽어들임
- UTF-16인코딩 방식으로 바꾸는 것을 InputStreamReader가 한다.
스트림의 종류
InputStream
, OutputStream
을 쓰면 바이트 스트림
Reader
, Writer
쓰면 문자 스트림
System.in
, System.out
은 Stream객체이고 기반스트림이다.
BufferedInputStream
, BufferedOutputStream
은 보조스트림이고 입출력 속도 향상 때문에 쓴다.
입출력 속도 향상?
BufferedInputStream
은 기반 스트림이 읽어 온 스트림 데이터를 내부버퍼에 저장한다. 입력버퍼에서 데이터를 받아야하는데, 프로그램 입출력 속도와 입력버퍼의 입출력 속도는 다르다. 그래서 둘 사이에 완충지대로 내부 버퍼를 놓는다면 입출력에 지연이 생겨도 내부 버퍼 안에 데이터가 미리 대기하고 있어서 지연 발생 없이 속도가 향상된다.
프로그램<-내부버퍼(BufferedInputStream)<-입력버퍼(기반스트림)
Java 레퍼런스를 참고해보면, 다음과 같이 쓰여있다.
- byte stream에서 character stream으로 바꾸기 위한 다리 역할
- bytes를 읽고 정의된
charset
을 사용해서 character로 디코드한다.
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
는 효율성 top.
참고