enum에 한국어 추가하기

이윤설·2024년 12월 21일
0

안드로이드 연구소

목록 보기
15/33

한국어 변수를 쓸 때의 문제점

enum class QuoteCategory(val koreanName: String) {
    노력,, 비즈니스, 사랑, 기타
}

위 예시처럼 enum에 한국어로 변수를 저장하면 단점이 존재한다.

호환성 문제 (ASCII 표준 위반)
enum 값에 비-ASCII 문자를 사용하는 것은 다양한 플랫폼과 환경에서 호환성 문제를 일으킬 수 있다. 특히 일부 구식 시스템이나 외부 라이브러리에서 ASCII 문자만을 허용하거나 처리할 수 있는 경우가 있다. 이런 경우, 한국어 문자나 다른 비-ASCII 문자는 문제가 될 수 있다.

그럼에도 불구하고 한국어를 사용하고 싶다면 어떻게 해야할까?

해결책

enum class QuoteCategory(val koreanName: String) {
    EFFORT("노력"),
    WEALTH("부"),
    BUSINESS("비즈니스"),
    LOVE("사랑"),
    EXERCISE("운동"),
    CONFIDENCE("자신감"),
    CREATIVITY("창의력"),
    HAPPINESS("행복"),
    OTHER("기타");

    companion object {
        fun fromKoreanName(koreanName: String): QuoteCategory? {
            return entries.find { it.koreanName == koreanName }
        }
    }

    // toString()을 오버라이드하여 koreanName을 반환하도록 함
    override fun toString(): String {
        return koreanName
    }
}

1. enum 생성자 사용

enum class QuoteCategory(val koreanName: String)

enum 클래스를 정의하며, 각 enum 상수가 koreanName이라는 String 타입의 매개변수를 가진다.

EFFORT("노력"),
WEALTH("부"),
...
  • 각 enum 상수를 정의하고, 괄호 안에 해당하는 한국어 이름을 지정한다.
  • 영문명은 enum 상수로, 한글은 그 상수의 koreanName 값으로 저장된다.
  • 이러한 방식은 enum 생성자를 사용한 것이다. 각 enum 상수는 하나 이상의 속성(property)을 가질 수 있다.
    • Map과는 다르게, 이는 컴파일 시점에 고정된 값들이다.

2. companion object 만들기

companion object {
    fun fromKoreanName(koreanName: String): QuoteCategory? {
        return entries.find { it.koreanName == koreanName }
    }
}
  • 한국어 이름으로 해당 enum을 찾을 수 있는 유틸리티 메소드다.
  • 예를 들어 QuoteCategory.fromKoreanName("노력")을 호출하면 QuoteCategory.EFFORT를 반환한다.
  • 만약 일치하는 한국어 이름이 없다면 null을 반환합니다.

3. toString() 만들기

override fun toString(): String {
    return koreanName
}
  • toString() 메소드를 오버라이드하여 enum 상수가 문자열로 변환될 때 영문 이름 대신 한국어 이름이 사용되도록 한다.
  • 예를 들어 println(QuoteCategory.EFFORT)를 실행하면 "EFFORT" 대신 "노력"이 출력된다.
    • 단, 타입은 여전히 enum 타입이다.

cf. companion object

Companion Object는 다음과 같은 특징이 있다.

  1. Kotlin에서 static 멤버를 정의하기 위해 사용된다. (Java의 static과 유사)
  2. 클래스당 하나만 선언할 수 있다.
  3. 클래스 이름으로 직접 접근할 수 있는 멤버들을 포함한다.

예시로 위 코드에서는,

// 이렇게 클래스 이름으로 직접 호출 가능
val category = QuoteCategory.fromKoreanName("노력")

companion object가 없었다면 인스턴스를 만들어서 사용해야 했을 것이다.

// companion object 없이 인스턴스 메소드였다면
val instance = QuoteCategory.EFFORT
instance.fromKoreanName("노력")  // 이렇게 써야 했을 것
profile
화려한 외면이 아닌 단단한 내면

0개의 댓글

관련 채용 정보