Charset 클래스란 무엇인가?
Java에서 Charset은 텍스트 데이터가 byte 배열과 String 간에 변환될 때 사용되는 문자 인코딩을 정의하는 클래스다.
즉, Java Application이 다양한 언어와 지역의 문자열을 처리하기 위해 특정한 인코딩 방식을 지정하고 이를 통해 바이트와 문자 간 변환을 수행하는 데 핵심적인 역할을 한다.
Charset 클래스는 다음과 같은 기능을 제공한다.
등록된 Charset 조회 | 현재 JVM에서 사용 가능한 Charset들의 목록을 조회할 수 있다. |
Charset 인스턴스 생성 | forName(String charsetName) 메서드를 통해 "UTF-8", "ISO-8859-1"와 같은 표준 명칭을 이용하여 해당 Charset 객체를 얻을 수 있다. |
문자열 변환 | charset.encode(CharBuffer) 또는 charset.decode(ByteBuffer) 메서드 등으로 실제 인코딩/디코딩 작업을 수행한다. |
표준 Charset 상수
Java 7 이후 java.nio.charset.StandardCharsets 클래스가 도입되어 "UTF-8"을 비롯한 자주 사용하는 표준 Charset에 대한 상수를 타입 세이프하게 제공한다.
예를 들어, StandardCharsets.UTF_8과 같이 직접 상수를 사용할 수 있어 문자열로 Charset을 가져올 때 발생 가능한 오타나 런타임 예외를 줄일 수 있다.
UTF-8 인코딩과의 관계
UTF-8은 전 세계 대부분의 문자들을 표현할 수 있는 유니버설 인코딩 방식이다. ASCII와 호환되며 가변 길이 인코딩을 통해 문자 하나를 1~4바이트로 표현한다.
UTF-8의 장점은 다음과 같다.
범용성 | 전 세계 언어를 표현 가능 |
ASCII 호환성 | 기존 ASCII 기반 시스템과의 높은 호환성 |
공식 표준 | 웹, 파일시스템, 데이터베이스 등 다양한 영역에서 사실상 표준 디펙토(de-facto) 인코딩 |
Java와 UTF-8
Java 18 이전에는 내부적으로 문자열을 유니코드(UTF-16)로 표현한다. 하지만 외부와 데이터를 주고받을 때 즉 입출력(IO) 시에는 바이트 단위의 인코딩을 명시적으로 지정해줘야 한다. 이때 UTF-8은 가장 널리 사용되는 인코딩이며 특히 국제화가 중요한 환경에서 표준처럼 활용된다.
Java 18 이후
Java 18 이후로는 플랫폼 기본 Charset이 UTF-8로 표준화되었다. 이전에는 OS 환경 변수를 기반으로 기본 Charset이 결정되었으나 이제는 특별히 지정하지 않은 한 기본 인코딩은 UTF-8이 된다.
Charset, UTF-8 예제
Charset 클래스를 사용해 UTF-8 인코딩을 다루는 과정을 살펴보자.
문자열을 UTF-8 바이트 배열로 변환하기
위 코드에서 getBytes(Charset charset) 메서드는 문자열을 해당 Charset을 통해 인코딩하여 바이트 배열로 변환한다. StandardCharsets.UTF_8은 타입 안전한 UTF-8 Charset 인스턴스를 제공하므로 "UTF-8"과 같은 리터럴 사용 시 발생 가능한 오타 문제를 줄인다.
UTF-8 바이트 배열을 문자열로 디코딩하기
위와 같이 바이트 배열을 new String(byte[], Charset) 생성자를 통해 UTF-8 Charset을 사용해 다시 문자열로 디코딩할 수 있다. 이 과정에서 원본 문자열 데이터가 손실되지 않고 복원된다.
Charset 객체를 통한 직접 변환
위 예제는 Charset을 통해 낮은 레벨의 버퍼 단위 변환한다. 이 메커니즘은 대용량 스트림 처리나 커스텀 변환 로직 구현 시 활용할 수 있다.
국제화와 호환성
UTF-8은 단지 영어 텍스트뿐 아니라 한글, 일본어, 중국어, 아랍어, 키릴 문자 등 다양한 문자 세트를 표현할 수 있다.
웹 서비스 | 서버-클라이언트 간 JSON, XML 전송 시 UTF-8을 활용해 다국어 처리 |
파일 입출력 | UTF-8로 인코딩된 파일을 읽고 쓸 때 Charset 객체를 명시적으로 사용 |
데이터베이스 연동 | JDBC 드라이버에서 UTF-8 인코딩 명시를 통해 다국어 데이터 처리 |
'Dev > Java' 카테고리의 다른 글
『Java』 Priority Queue (0) | 2024.12.02 |
---|---|
『Java』 배열과 리스트의 차이점 (0) | 2024.11.29 |
『Java』 Map, Stack, Queue, Deque (0) | 2024.11.28 |
『Java』 Java 8, Stream 기본 (1) | 2024.11.24 |
『Java』 내부 클래스, 정적 중첩 클래스, 지역 클래스, 익명 클래스 (0) | 2024.11.24 |