본문 바로가기
Kotlin

[Kotlin] Kotlin when 문에서 else를 써야 할 때와 생략할 때

by LoseyKim 2024. 12. 12.

Kotlin의 when 문은 다양한 조건을 간결하고 읽기 쉽게 처리할 수 있는 도구예요. 하지만 when 문을 사용할 때 else 블록을 언제 꼭 써야 하고, 언제 생략해도 괜찮은지 헷갈릴 때가 있죠. 이 글에서는 else가 필요한 상황과 생략 가능한 경우를 명확히 설명하고, 예제를 통해 쉽게 이해할 수 있도록 정리해 봤어요.


else를 생략할 수 있는 경우

else모든 가능한 조건을 완벽히 처리한 경우에 생략할 수 있어요. Kotlin 컴파일러가 "여기서는 빠지는 경우가 없다"라고 확신할 수 있는 상황에서만 else 없이 코드를 작성할 수 있답니다.

생략 가능한 조건

  1. enum class: 모든 값이 고정되어 있는 열거형 클래스의 경우.
  2. 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 블록이 반드시 필요한 경우는 모든 조건을 명확히 처리하지 못하거나, 컴파일러가 "빠지는 경우가 없다"고 확신할 수 없을 때예요.

반드시 필요한 조건

  1. 무한한 값의 가능성: Int, String 등 모든 경우를 나열할 수 없는 타입.
  2. 조건 누락: sealed classenum 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과 같은 무한 값 ✅ 반드시 필요
일부 조건 누락 ✅ 반드시 필요