
코틀린 when은 Java의 switch처럼 보이지만 더 넓게 쓸 수 있는 분기 문법입니다. 단순히 case를 나열하는 문법이 아니라 값을 만들어 내는 표현식으로도 자주 사용됩니다.
핵심은 when을 조건문이 아니라 결과를 고르는 표현식으로도 읽을 수 있다는 점입니다. 이 글은 Kotlin 공식 control flow 문서를 기준으로 switch와 다른 사용 감각을 정리합니다.

코틀린 when은 switch와 어디서 다를까
Kotlin의 `when`은 Java switch처럼 특정 값에 따라 분기할 수 있습니다. 하지만 Kotlin에서는 `when`을 결과 값을 만드는 expression으로도 자주 사용합니다.
val label = when (status) {
0 -> "대기"
1 -> "진행 중"
2 -> "완료"
else -> "알 수 없음"
}위 코드에서 `when` 전체가 하나의 값을 만들어 `label`에 들어갑니다. 그래서 각 branch는 같은 목적의 결과를 돌려줘야 읽기 쉽습니다.
표현식으로 쓰면 빠지는 경우가 없어야 한다
`when`을 statement로만 쓰면 특정 branch에서 행동만 하고 끝낼 수 있습니다. 하지만 expression으로 쓰면 결과 값이 필요하므로 모든 가능한 경우를 다뤄야 합니다.
val message = when (grade) {
"A" -> "훌륭합니다"
"B" -> "좋습니다"
else -> "다시 확인하세요"
}when expression은 결국 값을 하나 고르는 문법입니다. 그래서 빠진 경우가 있으면 결과를 만들 수 없습니다.
여러 값과 범위를 함께 처리할 수 있다
fun describe(score: Int): String {
return when (score) {
in 90..100 -> "A"
in 80..89 -> "B"
in 70..79 -> "C"
else -> "F"
}
}단일 값 비교뿐 아니라 범위 검사도 자연스럽게 쓸 수 있습니다. 여러 값을 쉼표로 묶어 같은 branch에서 처리할 수도 있습니다.
인자 없는 when은 if 체인처럼 쓸 수 있다
`when` 뒤에 비교 대상을 쓰지 않으면 각 branch에 조건식을 둘 수 있습니다. 복잡한 if-else 체인을 더 구조적으로 읽고 싶을 때 유용합니다.
val result = when {
name.isBlank() -> "이름 없음"
age < 0 -> "나이 오류"
else -> "정상"
}타입 검사와 스마트 캐스트
`when`은 타입 검사와도 잘 맞습니다. `is`로 타입을 확인한 branch 안에서는 해당 타입으로 smart cast되어 멤버에 접근하기 쉽습니다.
fun printLength(value: Any) {
when (value) {
is String -> println(value.length)
is List<*> -> println(value.size)
else -> println("unknown")
}
}sealed class와 함께 쓰면 더 강해진다
sealed class나 sealed interface는 가능한 하위 타입의 범위를 제한합니다. 이런 타입을 `when` expression으로 다루면 상태별 분기를 더 명확하게 만들 수 있습니다.
sealed interface UiState {
data object Loading : UiState
data class Success(val name: String) : UiState
data class Error(val message: String) : UiState
}
fun render(state: UiState): String = when (state) {
UiState.Loading -> "로딩 중"
is UiState.Success -> state.name
is UiState.Error -> state.message
}실무 체크리스트
- 값을 만드는 분기인지, 행동만 하는 분기인지 먼저 구분한다
- expression으로 쓸 때는 모든 경우를 다루는지 확인한다
- 범위, 여러 값, 타입 검사를 사용하면 if 체인보다 읽기 쉬운지 본다
- 상태 종류가 고정되어 있으면 sealed class와 함께 쓰는 구조를 검토한다
- branch 안에 너무 많은 로직이 들어가면 함수로 분리한다
정리
코틀린 when은 switch의 대체 문법으로만 보면 아쉽습니다. 값을 고르는 expression, 범위와 타입을 다루는 분기 도구, sealed class 상태 처리 도구로 함께 이해하는 편이 좋습니다.
Kotlin 문법 흐름은 코틀린 확장 함수는 왜 편할까, 코틀린 null safety 정리, 코틀린 sealed class와 enum 차이와 함께 보면 좋습니다. 외부 기준은 Kotlin Docs – when expressions and statements, Kotlin Docs – Conditions and loops, Kotlin Docs – Sealed classes and interfaces를 확인했습니다.