Java와 Kotlin에서 문자열을 입력받는 원리를 알아보기 전, 먼저 Encoding, Decoding, Character Set에 대해 알아보았습니다.
인코딩(encoding)은 부호화로, 어떤 정보를 정해진 규칙에 따라 변환하는 것을 의미한다. 컴퓨터에서는 문자들이 입력될 경우 컴퓨터가 이해할 수 있는 번호(0, 1)로 변환되어지며 이러한 부호 체계 즉, 사람이 사용하는 문자를 숫자로 매칭 시킨 것을 문자 집합(Character Set)이라 한다. 이러한 문자 집합에는 ASCII, 유니코드(Unicode) 등이 있다.
디코딩(decoding)은 인코딩을 통해 부호화된 것을 다시 문자로 변환하는 것을 의미한다.
ASCII 코드는 American Standard Code for Information Interchage의 약자로 최초의 문자 집합이며, 영어를 기준으로 개발되었다. 7 bit의 영역으로 0 ~ 127의 번호에 대응되는 특수문자와, 영어가 있다. 하지만 ASCII 코드는 말그래도 영어를 기준으로 개발되었기 때문에 아시아권 언어들에는 맞지 않는 문제가 있었다.
게다가 OS 마다 제공되는 문자 집합이 달라 깨지는 경우도 있었기에 이를 해결하기 위해 유니코드가 등장하게 되었다. ASCII 코드와 다르게 유니코드는 2 Byte로 문자와 기호를 보다 풍부하게 표현할 수 있었다. 유니코드에서 문자에 부여되는 번호를 코드 포인트라고 하며, 코트 포인트는 U+ 뒤에 2 Byte의 수를 16진수로 표현한다. 이때 U+0000부터 U+007F까지는 ASCII 코드 범위이다.
하지만 유니코드도 새로운 기호와 고대 문자 등 2 Byte로는 표현할 수 없는 어려움으로 UTF(Unicode Transformation Format)로 UTF-8, UTF-16 등의 유니코드 변환 형식이 등장하였다.
UTF-8은 8 bit 단위로 인코딩하는 방식으로 최소 1 Byte, 최대 6 Byte를 사용하는 가변 인코딩 방식을 따른다. 앞서 알아본 ASCII 문자는 7 bit로도 충분히 표현할 수 있었기 때문에 저장소의 불필요한 이용을 최소화하기 위해 문자에 따라 가변적인 접근방식을 취한다. UTF-16은 16 bit 단위로 인코딩되며 UTF-8과 다르게 고정 길이로 인코딩 되어진다. UTF-8가 데이터 크기에 맞게 블록의 크기가 조정된다면 UTF-16은 2 Byte 또는4 Byte의 블록에 데이터가 들어가는 경우. 따라서 데이터가 작다면 빈 공간이 존재하게된다.
Java 언어에서는 UTF-16을 표준으로 사용하며 char형 변수는 2 Byte로 표현되어진다고 한다. 이어서 Scanner, InputStream, BufferedReader에 대해 알아보자.
'JAVA' 카테고리의 다른 글
알고리즘에 사용되는 Scanner, InputStream, BufferedReader? (0) | 2022.03.31 |
---|---|
자바 프로젝트를 생성하면 구성되는 폴더와 파일🙋♂️ (0) | 2022.02.03 |
자바가 작동하는 과정 그리고 JVM? (0) | 2022.02.02 |
자바가 컴파일 언어? 아니면 인터프리터?🤦♂️ (0) | 2022.02.02 |