프로그래밍 언어/Kotlin

속성값으로 enum 객체 얻기 (value to enum)

Julie825 2023. 1. 6. 16:38

아래와 같은 Enum class가 있을 때, 객체 이름이나 속성값으로 객체를 얻는 것이 가능하다.

enum class Type(val num: Int) {
    A(1),
    B(2),
    C(3),
}

// "A" -> Type.A
//  1  -> Type.A

 

"A" → Type.A : valueOf 메서드 사용

 

Enum class에는 객체의 이름으로 enum 객체를 찾는 메서드가 이미 존재한다. 이걸 사용하자.

EnumClass.valueOf(value: String): EnumClass
// Type.valueOf("A") -> Type.A 반환

없는 객체를 검색하려고 시도하면 excpetion을 던진다는 점에 유의해야한다.

 

1  → Type.A : 직접 메서드 정의

 

그러나 다른 속성값에서 enum 객체를 찾고싶다면 아래와 같은 방법으로 메소드를 정의해야한다.

enum class Type(val num: Int) {
    A(1),
    B(2),
    C(3);
  
    companion object { /* (1) */
        fun fromNumber( number : Int ): Type? {
            return Type
            	.values() /* (2) [A, B, C] 반환 */
                .find{ it.num == number } /* (3) [A, B, C] 중 num 속성이 number인 것 반환*/
        }
    }
}

숫자로 enum class를 찾는 fromNumber( ) 메서드를 만드는 예시이다.

values( )로 반환받은 배열 [ A, B, C ]에 find( ) operation을 적용해 모든 enum 객체들 중 함수 argument로 들어온 값과 일치하는 value 속성을 가진 eunm 객체를 반환하고있다.

 

낯선 메서드들이 보인다면 아래를 보자.


1. Companion object 사용

메서드를 companion object로 선언하여 Type 객체를 생성하지 않고도 해당 함수를 사용할 수 있게 한다.

Type.fromNumber(2) // Type.B를 반환한다.

 

2. values()

enum class에 지원되는 메서드이다. 모든 enum 객체를 담고있는 Array를 반환한다.

위 코드에서 Type.values()를 호출하면 enum 객체 배열 [A,B,C]를 반환하게된다.

 

3. find()

/**
 * Returns the first element matching the given [predicate], or `null` if no such element was found.
 */
@kotlin.internal.InlineOnly
public inline fun <T> Iterable<T>.find(predicate: (T) -> Boolean): T? {
    return firstOrNull(predicate)
}

Iterable에 사용할 수 있는 고차함수이다.

find에는 item을 받아서 Boolean 값을 반환하는 람다함수를 넣어줘야하는데,

이때 이 식을 만족해서 true를 반환하는 첫번째 원소를 반환한다.

true가 한번도 안나왔다면 null이 반환된다.