MessageFormat

MessageFormat (언어 중립 메시지 조합)

연결된 메시지를 언어 중립적인 방식으로 만들어 내는 수단을 제공하는 클래스예요. 최종 사용자에게 표시하는 메시지를 구성할 때 유용해요. MessageFormat은 객체 집합을 받아 형식화한 뒤, 형식화된 문자열을 패턴의 적절한 위치에 삽입해요.

출처: Java API Reference

본문

참고: MessageFormat은 다른 Format 클래스와 달리 getInstance 스타일 팩토리 메서드가 아니라 생성자 중 하나로 객체를 만들어요. MessageFormat 자체가 로케일 특정 동작을 구현하지 않기 때문에 팩토리 메서드가 필요 없어요. 로케일 특정 동작은 사용자가 제공하는 패턴과 삽입 인자에 쓰이는 하위 포매터로 정의돼요.

패턴과 그 해석

MessageFormat은 다음 형태의 패턴을 사용해요.

MessageFormatPattern:    String
                         MessageFormatPattern FormatElement String
FormatElement:           { ArgumentIndex }
                         { ArgumentIndex , FormatType }
                         { ArgumentIndex , FormatType , FormatStyle }
FormatType:              one of number date time choice
FormatStyle:             short medium long full integer currency percent SubformatPattern

String 안에서 작은따옴표 쌍은 작은따옴표를 제외한 임의의 문자를 인용(quote)할 수 있어요. 예를 들어 패턴 문자열 "'{0}'"는 형식 요소가 아니라 문자열 "{0}"을 나타내요. 작은따옴표 자체는 String 전체에서 이중 작은따옴표 ''로 표현해야 해요.

SubformatPattern은 그에 상응하는 하위 포매터가 해석해요. 예를 들어 서울과 근무 일정을 담은 메시지를 만들려면:

Object[] arguments = {
    "2026", "9월 22일",
    "SQL", "Python"
};
MessageFormat form = new MessageFormat(
    "수강생의 언어는 {0}와 {1}입니다.", Locale.KOREA);
System.out.println(form.format(arguments));

인자를 숫자·날짜·시간·초이스 포매터로 지정하려면 포맷 타입을 넣으면 돼요. 예: "{0, number, integer}", "{1, date, medium}", "{2, choice, 0#no items|1#one item|1<{2} items}".

동기화

MessageFormat은 동기화되지 않아요. getters/setters를 포함한 어떤 메서드도 스레드 안전하지 않아요. 로케일 데이터나 형식이 변경되면 applyPattern 등을 다시 호출해 동기화해야 하고, 여러 스레드가 공유한다면 외부 동기화가 필요해요.

더 알아보기 (Learn more)

Java 공식 API