Kotlin의 when
문은 다양한 조건을 간결하고 읽기 쉽게 처리할 수 있는 도구예요. 하지만 when
문을 사용할 때 else
블록을 언제 꼭 써야 하고, 언제 생략해도 괜찮은지 헷갈릴 때가 있죠. 이 글에서는 else
가 필요한 상황과 생략 가능한 경우를 명확히 설명하고, 예제를 통해 쉽게 이해할 수 있도록 정리해 봤어요.
else
를 생략할 수 있는 경우
else
는 모든 가능한 조건을 완벽히 처리한 경우에 생략할 수 있어요. Kotlin 컴파일러가 "여기서는 빠지는 경우가 없다"라고 확신할 수 있는 상황에서만 else
없이 코드를 작성할 수 있답니다.
생략 가능한 조건
enum class
: 모든 값이 고정되어 있는 열거형 클래스의 경우.sealed class
: 모든 서브클래스를 처리한 경우.
예제 1: enum class
의 모든 값 처리
enum class State {
LOADING, SUCCESS, ERROR
}
fun handleState(state: State) {
when (state) {
State.LOADING -> println("Loading...")
State.SUCCESS -> println("Success!")
State.ERROR -> println("Error!")
}
}
위 코드는 State
의 가능한 값(LOADING
, SUCCESS
, ERROR
)을 모두 처리했기 때문에 else
를 생략할 수 있어요. enum class
는 모든 값이 명확히 정의되어 있어, 누락된 경우가 없다는 것을 컴파일러가 보장하죠.
예제 2: sealed class
의 모든 서브클래스 처리
sealed class Result
object Success : Result()
object Failure : Result()
fun handleResult(result: Result) {
when (result) {
Success -> println("Success!")
Failure -> println("Failure!")
}
}
여기서도 Result
의 모든 서브클래스(Success
, Failure
)를 처리했기 때문에 else
가 필요 없어요. sealed class
는 확장 가능한 클래스가 아니기 때문에, 컴파일러가 모든 서브클래스를 알고 있기 때문이에요.
else
가 필요한 경우
else
블록이 반드시 필요한 경우는 모든 조건을 명확히 처리하지 못하거나, 컴파일러가 "빠지는 경우가 없다"고 확신할 수 없을 때예요.
반드시 필요한 조건
- 무한한 값의 가능성:
Int
,String
등 모든 경우를 나열할 수 없는 타입. - 조건 누락:
sealed class
나enum class
를 사용하더라도 일부 값만 처리한 경우.
예제 1: 무한한 값이 가능한 타입
fun classifyNumber(number: Int): String {
return when (number) {
1 -> "One"
2 -> "Two"
else -> "Other"
}
}
Int
는 모든 정수 값을 가질 수 있기 때문에, 나머지 숫자를 처리하기 위해 반드시 else
를 추가해야 해요. else
가 없다면 런타임 오류가 발생할 가능성이 있어요.
예제 2: sealed class
에서 일부 값만 처리
sealed class Result
object Success : Result()
object Failure : Result()
object Unknown : Result()
fun handleResult(result: Result) {
when (result) {
Success -> println("Success!")
Failure -> println("Failure!")
else -> println("Unknown result")
}
}
Unknown
이 정의되어 있지만 이를 처리하지 않았다면, 누락된 경우를 대비하기 위해 else
가 필요해요. else
를 추가하면 예상치 못한 오류를 방지할 수 있답니다.
요약: else
를 추가해야 하는지 판단하는 기준
조건 유형 | else 필요 여부 |
enum class 의 모든 값 처리 |
❌ 생략 가능 |
sealed class 의 모든 서브클래스 처리 |
❌ 생략 가능 |
Int , String 과 같은 무한 값 |
✅ 반드시 필요 |
일부 조건 누락 | ✅ 반드시 필요 |
'Kotlin' 카테고리의 다른 글
[Kotlin] 코루틴(coroutine)예외 처리와 취소 (0) | 2024.12.02 |
---|---|
[Kotlin] StateFlow: Android 상태 관리를 위한 필수 도구 (1) | 2024.11.15 |
[Kotlin] 언더스코어(_)를 변수 이름에 붙이는 이유 (1) | 2024.09.03 |
[Kotlin] Coroutine Suspend function (0) | 2024.03.25 |
[Kotlin] Data class, Sealed class (0) | 2024.03.06 |
[Kotlin] Scope functions(let, run, with, apply, also) (0) | 2024.03.05 |
[Kotlin] object, companion object (0) | 2024.03.05 |