with ChatGPT 시리즈는 ChatGPT의 내용과 개인의 생각을 토대로 학습해 보는 컨텐츠입니다.
Kotlin의 when 표현식은 Java의 switch 문을 대체하는 강력한 제어 구조입니다.
기본적인 조건 분기뿐만 아니라 범위 (Range) 체크, 타입 검사, 패턴 매칭까지 지원하여 실무에서 다양한 방식으로 활용될 수 있습니다.
이번 주제에서는 when 표현식과 기존 switch 문의 차이점, 그리고 실무에서 when을 효율적으로 사용하는 방법을 살펴보겠습니다.
🔥 1. when 표현식과 switch 문의 차이점
비교 항목 | Kotlin when | Java switch |
지원 타입 | 숫자, 문자열, Boolean, enum, 범위, is 검사 등 | 숫자 (int), enum, String (Java 7+) |
표현식 가능 여부 | ✅ 반환값을 가질 수 있음 | ❌ 표현식으로 사용 불가 |
break 필요 여부 | ❌ 필요 없음 (자동 종료) | ❌ break 없으면 fail-through 발생 |
범위 조건 (in) | ✅ 지원 | ❌ 지원 안 함 |
객체 비교 (is) | ✅ 지원 | ❌ 지원 안 함 |
🛠️ 2. 기본적인 when 표현식 사용법
✅ 1️⃣ 기존 switch 문과 when 비교
🔹 Java switch 문
int number = 2;
String result;
switch (number) {
case 1: result = "One"; break;
case 2: result = "Two"; break;
case 3: result = "Three"; break;
default: result = "Unknown"; break;
}
System.out.println(result);
- break 문이 없으면 fall-through 현상 발생
🔹 Kotlin의 when 표현식
val number = 2
val result = when (number) {
1 -> "One"
2 -> "Two"
3 -> "Three"
else -> "Unknown"
}
println(result)
- 자동으로 break 처리됨 → case 대신 -> 사용
- when 자체가 표현식 (Expression)이라 값 반환 가능
🎯 3. when의 강력한 기능과 활용법
✅ 2️⃣ when에서 여러 조건 처리하기
val number = 3
val result = when (number) {
1, 3, 5, 7, 9 -> "Odd" // 여러 값 한 번에 매칭 가능
2, 4, 6, 8, 10 -> "Even"
else -> "Unknown"
}
println(result) // 출력: Odd
- 여러 값을 ,로 구분하여 하나의 조건으로 처리 가능
✅ 3️⃣ 범위 (Range) 검사 (in 연산자 활용)
val score = 85
val grade = when (score) {
in 90..100 -> "A"
in 80..89 -> "B"
in 70..79 -> "C"
else -> "F"
}
println(grade) // 출력: B
- in 키워드를 사용하여 범위 (Range) 체크 가능
- 점수 구간에 따라 학점을 부여하는 로직 등에서 유용
✅ 4️⃣ 타입 검사 (is 연산자 활용)
fun checkType(value: Any) = when (value) {
is String -> "This is a String"
is Int -> "This is an Integer"
is Boolean -> "This is a Boolean"
else -> "Unknown type"
}
println(checkType("Hello")) // 출력: This is a String
println(checkType(42)) // 출력: This is a Integer
println(checkType(true)) // 출력: This is a Boolean
- is 연산자를 사용하여 객체의 타입을 검사 가능
- 스마트 캐스트 (Smart Cast)로 자동 변환됨 (따로 캐스팅 필요 없음)
✅ 5️⃣ 함수 반환값으로 활용 (표현식)
fun getStatus(code: Int) = when (code) {
200 -> "OK"
404 -> "Not Found"
500 -> "Internal Server Error"
else -> "Unknown"
}
println(getStatus(404)) // 출력: Not Found
- when을 반환값으로 사용할 수 있어 코드가 더욱 간결해짐
✅ 6️⃣ when을 else 없이 사용 (열거형 enum 활용)
enum class Day { MON, TUE, WED, THU, FRI, SAT, SUN }
fun isWeekend(day: Day) = when (day) {
Day.SAT, Day.SUN -> true
else -> false
}
println(isWeekend(Day.SAT)) // 출력: true
println(isWeekend(Day.MON)) // 출력: false
- enum을 사용하면 when에서 else 없이도 모든 경우를 체크 가능
🚀 4. 실무에서 when 활용 사례
✅ 1️⃣ API 응답 코드 처리 (HTTP Status)
fun handleResponse(code: Int) = when (code) {
in 200..299 -> "Success"
in 400..499 -> "Client Error"
in 500..599 -> "Server Error"
else -> "Unknown Response"
}
- API 응답을 처리할 때 in 연산자로 코드 범위를 한 번에 처리 가능
✅ 2️⃣ UI 상태 변경 (Android ViewModel 예제)
enum class UiState { LOADING, SUCCESS, ERROR }
fun getMessage(state: UiState} = when (state) {
UiState.LOADING -> "Loading..."
UiState.SUCCESS -> "Success!"
UiState.ERROR -> "An error occurred."
}
- enum을 활용하여 UI 상태에 따라 메시지를 동적으로 변경 가능
🔥 when 표현식 요약
기능 | Java switch | Kotlin when |
지원 타입 | int, String, enum | 숫자, String, Boolean, enum, is, in |
break 필요 여부 | ✅ 필요 | ❌ 필요 없음 |
표현식 가능 여부 | ❌ 불가능 | ✅ 가능 (값 반환 가능) |
범위 검사 (in) | ❌ 불가능 | ✅ 가능 |
타입 검사 (is) | ❌ 불가능 | ✅ 가능 |
Kotlin의 when은 단순한 조건문을 넘어서, 패턴 매칭과 타입 검사까지 지원하는 강력한 표현식이다!
🤔 추가로 생각해 볼 질문들
- when 표현식은 성능적으로 switch 문보다 더 빠를까?
- when에서 is를 사용할 때, 스마트 캐스트가 항상 동작하는가?
- when을 else 없이 사용할 수 있는 경우와, else가 꼭 필요한 경우는?
- Java switch 문과 when 표현식의 내부 구현 방식 차이는?
- when을 함수형 스타일로 더 확장할 수 있는 방법은 없을까? (예: Map을 활용한 리팩토링)