Kotlin의 when 구조는 프로그램의 실행 흐름을 제어하는 강력한 도구로, 전통적인 Java의 switch-case를 대체합니다. when은 코드 표현력을 높이고 boilerplate 코드를 줄이며 타입의 안전성을 높이기 위해 도입되었습니다.
Java에서는 switch-case 구조가 특정 타입(enum, int, String)으로 제한되어 있습니다. Kotlin 개발자들은 조건 분기를 더 표현력 있고 안전하게 만들기 위해 노력했습니다.
Java의 switch-case 제한은 특히 컬렉션 작업, 범위 비교 또는 다양한 타입 처리 시 코드의 확장성과 유지 보수를 어렵게 만듭니다.
Kotlin의 when 구조는 범용적입니다: 값 반환이 가능한 표현식으로 작동하며, 조건 검사, 범위, 개별 값, 타입 및 조건 조합을 지원합니다.
fun describe(obj: Any): String = when (obj) { 1 -> "One" in 2..10 -> "From two to ten" is String -> "String with length ${obj.length}" else -> "Unknown" } val res1 = describe(1) // "One" val res2 = describe(5) // "From two to ten" val res3 = describe("Kotlin") // "String with length 6" val res4 = describe(42.0) // "Unknown"
when이 인수 없이 사용될 수 있습니까?
네, when은 특정 변수의 값을 검사할 필요가 없는 경우 긴 if-else 체인을 대체할 수 있습니다.
when { x < 0 -> println("Negative") x == 0 -> println("Zero") else -> println("Positive") }
when 구조에서 else 블록은 필수입니까?
모든 가능한 경우가 처리되었다면 else 블록은 필수가 아닙니다. 예를 들어, enum 또는 sealed 클래스의 경우입니다. 하지만 처리되지 않은 경우가 발생할 가능성이 있다면, 컴파일 오류를 피하기 위해 else가 필수적입니다.
sealed class Fruit object Apple : Fruit() object Pear : Fruit() fun check(f: Fruit): String = when (f) { Apple -> "It's an apple" Pear -> "It's a pear" // else 블록이 필요 없으며, 컴파일러가 오류를 발생시키지 않음 — 모든 경우가 처리됨 }
when에서 여러 값을 하나의 분기로 사용할 수 있습니까?
네, 여러 값을 쉼표로 결합하여 사용할 수 있습니다.
when (value) { 0, 1 -> println("Zero or One") else -> println("Other") }
결제 시스템에서 switch-case가 작업 상태를 결정하는 데 사용됩니다. 새로운 상태 유형을 추가하는 동안 switch를 업데이트하는 것을 잊었습니다. 처리되지 않은 상태는 silent-error를 초래합니다.
장점:
단점:
Kotlin에서는 상태를 위한 sealed 클래스를 사용하고, when 구조로 이를 처리합니다. 새로운 상태를 추가할 때는 컴파일러가 새로운 경우 처리를 요구합니다.
장점:
단점: