작성
·
191
0
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
안녕하세요. OutputStreamWriter, InputStreamReader를 이용해 한글을 파일에 쓰고 읽는 내용이 수업에 있는데요.
UTF-8은 한글을 3바이트로 저장한다고 되어있고, 수업 때 작성한 코드를 보면 한글을 char 타입으로 저장이 잘 되는 것을 확인할 수 있습니다. (수업에서는 int형으로 저장했다가 이를 char형으로 캐스팅한것이지만 제가 따로 코딩을 해보아도 char 자료형에 한글이 잘 저장되더라구요)
utf-8 에서는 한글을 3바이트로 저장하는데 자바에서 2바이트 크기인 char자료형에 잘 저장될 수 있는지 찾아보았는데, 자바에서는 변형된 utf-8을 쓴다고 하고 뭔가 굉장히 자세한 내용이 있었습니다.
그냥 자바에서는 utf-8에서는 3바이트로 저장되는 한글을 특별한 방법으로 2바이트로 저장한다고 알고있으면 될까요?
근데 또 한글로 저장해놓은 String을 바이트배열로 바꾸면 한글자당 세개의 바이트가 나와가지고 이해가 어렵습니다..
답변 1
1
안녕하세요, 인프런 AI 인턴입니다.
문예찬님께서 질문해주신 자바에서의 char
자료형과 UTF-8 인코딩 관련 내용을 설명드리겠습니다.
자바에서는 기본적으로 char
타입이 UTF-16 인코딩을 사용하여 2바이트로 문자를 저장합니다. UTF-16은 대부분의 요즘 문자들을 2바이트로 표현할 수 있도록 설계되었습니다. 그러나, UTF-8은 문자의 종류에 따라 1바이트에서 최대 4바이트까지 사용합니다. 한글의 경우, UTF-8에서 3바이트가 사용됩니다.
즉, 자바에서는 메모리 내에서 char
가 UTF-16을 사용하여 2바이트로 저장되지만, 입출력 시에는 UTF-8로 변환되어 3바이트로 표현될 수 있습니다.
이를 이해하기 위해 기억해야 할 점은:
- 자바의 char
는 UTF-16을 사용하여 2바이트로 문자를 처리합니다.
- UTF-8은 외부 저장 및 전송을 위한 인코딩 방식으로, 한글을 3바이트로 처리할 수 있습니다.
사용하신 OutputStreamWriter
와 InputStreamReader
같은 클래스는 인코딩을 명시하지 않으면 JVM의 기본 문자셋을 사용합니다. 일반적으로 UTF-8로 작업할 때는 명시적으로 인코딩을 지정하는 것이 좋습니다.
이해하는 데 도움이 되셨기를 바라며, 혹시 추가적으로 궁금한 부분이 있으면 계속 질문해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요. 문예찬님
getBytes()에서 Charset을 생략하게 되면, 시스템의 기본 인코딩을 사용하게 됩니다.
예를 들어서 UTF-8이라면 3byte로 변환됩니다.
따라서 getBytes(UTF-8)이라고 생각하시면 됩니다.
참고로 자바가 사용하는 char 타입은 UTF-16을 사용합니다.
지금까지 설명드린 내용은 앞서 1. 문자 인코딩 강의에서 모두 설명한 부분들이어서 다시 한번 복습해보시면 이해가 되실거에요.
감사합니다.
그럼 혹시 아래처럼 한글 한글자를 담은 String으로부터 byte배열로 변환할 때는 한글자짜리 한글 String을 utf-8로 저장한다는 정보를 주지 않았기 때문에 자바는 utf-16으로 저장할거 같은데요. 그렇다면 2바이트로 저장되었을 저 "ㄱ"을 왜 바이트로 변환했을 때는 3바이트로 저장되었던 것처럼 바이트배열의 크기가 3이 되는 건가요..?
2바이트로 저장되있는 한글이더라도 바이트로 변환하면 변환된 바이트배열의 크기는 한글자당 3이 될수도 있는걸까요? 바이트배열의 크기는 원래 문자의 크기와 관련이 있는게 아닌건가요...?
byte[] bytes = "ㄱ".getBytes(); for (byte b : bytes) { System.out.println("b = " + b); } /* b = -29 b = -124 b = -79 */