개발 무지렁이

[Java] 1바이트, 1문자, 多문자 읽기 본문

Backend/자바

[Java] 1바이트, 1문자, 多문자 읽기

Gaejirang-e 2023. 3. 11. 18:42

InputStream


1byte 읽기

InputStream is = System.in;
int i = is.read(); // 1byte읽기

⭐ 주의)

import java.io.IOException;
import java.io.InputStream;

public class KeyboardInputIOExam {
    public static void main(String[] args) throws IOException {
        InputStream is = System.in;
        int i = is.read();
        System.out.println(i + " = " + (char)i); 
    }

}

InputStream에서 A를 입력하고, char로 캐스팅해서 출력하면 A그대로 나오지만
한글을 한문자 입력했을 시, 전혀 이상한 문자가 나오게 된다.
이는 ASCII코드는 1byte(8bits) 중 7bits를 사용하기 때문에
(나머지 1비트는 패리티비트로, 데이터 에러 탐지를 위해 사용한다)
0부터 127까지의 128개의 수에 대응하는 문자가 존재한다.

하지만, 전 세계 언어의 문자를 표현하기엔 128개의 수로는 부족하고,
2byte(16bits)를 사용해서 65536개의 수에 대응하는 문자를 표현할 수 있는 유니코드를 만들었다.

즉, 한글은 유니코드에 속하기 때문에 적어도 2byte는 읽어줘야하는데
InputStream은 1byte만을 읽음으로 표현할 수 있는 값의 범위를 벗어남으로
엉뚱한 문자가 나오게 된다.

InputStreamReader


1문자 읽기

InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(System.in);
int i = isr.read(); // 1문자읽기

BufferedReader


1문자읽기 -> 多문자 읽기
(Buffered, 입출력의 속도를 높여준다)

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String data = br.readLine(); // 한줄읽기
Comments