이번 게시물에는 제가 사용중인 Enum 타입을 안전하게 사용하는 방법을 공유하고자 합니다.
우리는 서버에서 전달받은 데이터를 enum 타입으로 변환하여 사용하는 경우가 많이 있습니다.
그런데, 서버 데이터에서 앱에 정의되지않은 데이터를 보낼경우, 당연히 exception이 발생하게 됩니다.
이런 부분에서 좀더 안전하고, exception이 발생하지 않도록 한다면 좀더 견고한 앱이 될겁니다.
string 데이터를 enum 타입으로 변환하기 위해서는 valueOf() 를 사용하는데, 이때 enum에 정의되지 않은 string이 입력이 되는 경우엔 IllegalArgumentException 이 발생합니다.
그래서, try.. catch 로 exception 처리를 하게됩니다.
enum class Fruit {
APPLE,
ORANGE,
STRAWBERRY,
GRAPE
}
println(
"내가 좋아하는 과일은 ${
try {
Fruit.valueOf("MELON").name
} catch (e: IllegalArgumentException) {
Fruit.GRAPE
}
} 입니다."
)
enum 타입 변환시에 매번 try.. catch를 하는것은 코드도 길어지고, 가독성도 안좋아집니다. 물론, 타이핑도 많이해야 하기때문에 여간 불편한게 아닙니다.
그래서, 이 부분을 좀더 쾌적하게 해결하고자 inline 함수로 만들어보았습니다.
/**
* 모든 Enum 타입을 안전하게 반환합니다.
*/
inline fun <reified T : Enum<T>> safeValueOf(type: String, default: T): T {
return try {
java.lang.Enum.valueOf(T::class.java, type)
} catch (e: IllegalArgumentException) {
default
}
}
string을 받아서, enum 타입으로 변환시 exception이 발생하면 default 값을 반환하는 코드입니다.
// MELON 이 없을 경우엔 default 값을 표시하도록 함.
println("내가 좋아하는 과일은 ${safeValueOf("MELON", Fruit.GRAPE).name} 입니다.")
위의 try.. catch로 처리하는 코드와 동일한 동작을 하는 코드입니다.
훨씬~ 간결하고, 가독성이 좋아졌다는 것을 한눈에 보아도 아실수 있으실 겁니다.
그리고, 위의 샘플 코드의 Fruit 외에도 모든 Enum 타입을 사용할 수 있습니다.
enum class Animal(val displayName: String) {
DOG("개"),
CAT("고양이"),
RABBIT("토끼"),
PIG("돼지")
}
// 모든 Enum 타입에 사용이 가능합니다.
println("내가 좋아하는 동물은 ${safeValueOf("COW", Animal.RABBIT).displayName}입니다.")
이처럼, default 값을 지정하여, 잘못된 값이나 미지정 값이 입력이 되어도 안전하게 처리가 가능합니다.
위의 샘플 코드는 아래 Github 링크를 통해 확인하세요.
'Android + Kotlin' 카테고리의 다른 글
[Android Kotlin] @BindingAdapter 를 사용하여 DataBinding 끝내기 (0) | 2022.02.09 |
---|---|
[Android Kotlin] TransactionTooLargeException 해결 방법 (0) | 2022.01.25 |
[Android Kotlin] Fragment arguments 를 쾌적하게(Extension) 해보자. (0) | 2022.01.21 |
[Android Kotlin] 화면간 intent 사용을 쾌적하게(Extension) 해보자. (0) | 2022.01.21 |
[Android Kotlin] crossinline, reified 를 알아보자. (0) | 2022.01.21 |