inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

문자 다루기4 - BufferedReader

UTF-8 문자열을 char 타입으로 변경하는것에 대해서 궁금합니다.

130

이석준

작성한 질문수 8

0

public static void main(String[] args) throws IOException {

    String writeString = "가나다ABC";
    System.out.println("writeString = " + writeString);

    // 파일에 쓰기
    var fw = new FileWriter(FILE_NAME, StandardCharsets.UTF_8);
    fw.write(writeString);
    fw.close();

    // 파일에서 읽기
    var content = new StringBuilder();
    var fr = new FileReader(FILE_NAME);
    int ch;
    while ((ch = fr.read()) != -1) {
      char ch1 = (char) ch;
      System.out.println("ch1 = " + ch1);
      content.append(ch1);
    }
    fr.close();
    System.out.println("readString = " + content);
  }

 

질문1) 예제의 코드에서 char ch1 = (char) ch; 로 캐스팅하는부분이 궁금해요

 

질문2) 위의 가정이 맞다면 Reader, Writer 은 항상 JVM이 관리하는 UTF-16 으로 읽는과정이 있으니 byte 단위로 읽는 Stream 보다 성능적으로 느릴 것 같은데 맞을까요?

java 네트워크 객체지향

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

이석준님, UTF-8 문자열을 char 타입으로 변경하는 것에 대해 문의주셨군요. 질문에 대해 하나씩 답변드리겠습니다.

질문 1) char ch1 = (char) ch;로 캐스팅하는 부분

  • UTF-8 인코딩에서 글자 하나를 나타내기 위해 1바이트에서 4바이트까지 사용될 수 있지만, 코드에서 사용하신 Reader는 기본적으로 UTF-16으로 변환하여 읽어옵니다. 이때, UTF-8 인코딩된 데이터가 Java 내부에서는 UTF-16으로 변환되어 char로 처리됩니다.

    • 말씀하신 것처럼, 한글 가~다와 같은 문자들은 UTF-16에서 2바이트로 표현할 수 있기 때문에 char로 변환이 가능한 것입니다.

    • fr.read() 메서드는 캐릭터 하나를 읽고, 이는 자동적으로 UTF-8에서 UTF-16으로 변환됩니다. 따라서 내부적으로 유니코드 문자 단위로 처리가 되는 것이 맞습니다.

    • 이모지와 같이 UTF-16에서 서러게이트 페어로 표현되어야 하는 문자는 두 바이트로 처리되기 때문에, 단일 char로 처리하기 곤란해집니다. 이에 따라 깨지는 현상을 보신 것으로 보입니다.

질문 2) JVM이 관리하는 UTF-16으로 읽는 Reader, Writer와 Stream의 성능 차이

  • Reader와 Writer는 문자 단위로 데이터를 처리하기 때문에 유니코드 변환 작업이 포함됩니다. 이는 Byte 단위로 처리하는 Stream에 비해 추가적인 변환 작업을 요구하기 때문에 성능적으로 약간의 차이가 있을 수 있습니다.

하지만, Reader와 Writer는 문자열 데이터를 더 직관적으로 다루기 위해 설계되어 있어, 유니코드 문자 기반의 입출력 작업에서는 자연스러운 선택입니다. 성능 차이는 코드 설계 및 데이터 크기 등에 의존할 수 있기 때문에 실제 사용 시 이러한 측면을 함께 고려하는 것이 좋습니다.

추가 정보는 Spring Boot Reference Documentation에서 IO와 관련된 유틸리티와 통합에 관한 자료를 참고하실 수 있습니다.

도움이 되셨길 바랍니다. 다른 질문이 있으시면 언제든지 문의해주세요. 감사합니다!

빠져나오기 위해서 System.in을 닫는다는게 무슨 의민가요??

0

31

1

IO활용-회원관리예제1 샘플코드 문의

0

36

1

RequestHandler 버전 간 process() 파라미터 차이 질문

0

105

2

리플렉션 default

0

77

1

그럼 SOURCE나 CLASS는 어떤 경우에 사용하나요?

0

112

2

네트워크 프로그램 자원종료 Socket 정리 시 closed 사용 문의

0

141

2

FileInputStream의 transferTo 사용 시 Buffer 문의

0

85

1

오타 제보 드립니다

0

102

2

강좌 복습 팁이 있으신 분들 공유해주시면 감사하겠습니다.

0

137

1

16강 질문있습니다.

0

73

1

한글이 깨질 떄 어떻게 해야 하나요?

0

103

1

자원 정리시 에러가 발생 했을 때 메모리 상황 및 실무에서 로그 확인 방법

0

119

1

인텔리제이에서 네모(스탑버튼) 누르는 것의 의미

-1

93

1

강의 섹션 8: 네드워크 -프로그램 3부분 10:45 오타?

0

116

2

제대로 이해한게 맞나 궁금합니다

0

109

1

File,Files 강의 2번쨰 Files 07:30 에 tmep 파일들을 다 지운건가요 ?

0

87

1

/.well-known/appspecific/com.chrome.devtools.json 에러에 대해서

0

738

1

Socket 자원을 정리할때 stream 을 정리하지 않는 이유가 궁금합니다.

0

109

1

클라이언트 강제종료시 오류 메세지

0

136

2

고급 2편에는 퀴즈가 없네요?

0

121

1

55. 네트워크 프로그램5 - 자원정리2 질문

0

91

1

클라이언트가 FIN과 함께 보내는 ACK는 무엇에 대한건가요?

1

134

2

BufferedInputStream이 1바이트씩 조회해도 성능이 좋은 이유

0

93

1

오타제보

0

76

2