아래와 같은 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이 반환된다.
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
Kotlin의 ArrayDequeue : Stack & Queue를 손쉽게 사용하기 (1) | 2023.01.06 |
---|---|
Kotlin의 시간계산 : LocalDate, LocalDateTime, Duration (0) | 2022.11.27 |
List를 Map으로 만들기: associate (0) | 2022.11.26 |
java.io.File 사용법 (0) | 2022.11.06 |
Kotlin Collection 변환 함수 모음 (0) | 2022.10.29 |