본문 바로가기
Dev/Java

『Java』 자바에서 Charset 클래스와 UTF-8의 관계는 무엇인가?

by 세대교체 2024. 12. 10.

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 인코딩 명시를 통해 다국어 데이터 처리