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
}
}
enum class QuoteCategory(val koreanName: String)
enum 클래스를 정의하며, 각 enum 상수가 koreanName
이라는 String 타입의 매개변수를 가진다.
EFFORT("노력"),
WEALTH("부"),
...
koreanName
값으로 저장된다.companion object {
fun fromKoreanName(koreanName: String): QuoteCategory? {
return entries.find { it.koreanName == koreanName }
}
}
QuoteCategory.fromKoreanName("노력")
을 호출하면 QuoteCategory.EFFORT
를 반환한다.override fun toString(): String {
return koreanName
}
println(QuoteCategory.EFFORT)
를 실행하면 "EFFORT" 대신 "노력"이 출력된다. Companion Object는 다음과 같은 특징이 있다.
예시로 위 코드에서는,
// 이렇게 클래스 이름으로 직접 호출 가능
val category = QuoteCategory.fromKoreanName("노력")
companion object가 없었다면 인스턴스를 만들어서 사용해야 했을 것이다.
// companion object 없이 인스턴스 메소드였다면
val instance = QuoteCategory.EFFORT
instance.fromKoreanName("노력") // 이렇게 써야 했을 것