프로그래밍Kotlin 개발자

Kotlin의 when 구조는 무엇이며, 어떻게 작동하고, Java의 switch-case와 어떤 점이 다르며, 다양한 상황을 처리하는 데 어떤 기능을 제공합니까? 다양한 사용 사례를 제시하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변.

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"

주요 특징:

  • 표현식과 연산자로 작동할 수 있는 능력.
  • 값, 타입, 범위 및 복합 조건에 대한 검사.
  • 모든 변수를 처리할 때의 안전성 보장 (예: sealed 클래스와 함께).

함정 질문.

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") }

일반적인 오류 및 안티 패턴

  • 불완전한 경우를 처리할 때 else 블록을 생략 (런타임 오류로 이어질 수 있음).
  • when을 너무 복잡한 분기로 과부하 시키기 (가독성 저하).
  • 타입 및 범위 검사를 적용하지 않고 switch-case처럼만 사용하는 when.

실제 사례

부정적 케이스

결제 시스템에서 switch-case가 작업 상태를 결정하는 데 사용됩니다. 새로운 상태 유형을 추가하는 동안 switch를 업데이트하는 것을 잊었습니다. 처리되지 않은 상태는 silent-error를 초래합니다.

장점:

  • 적은 수의 상태에서 빠른 변경 구현.

단점:

  • 모든 상태가 고려되었다는 보장 없음.
  • 새로운 값이 나타날 때 silent 오류 발생.

긍정적 케이스

Kotlin에서는 상태를 위한 sealed 클래스를 사용하고, when 구조로 이를 처리합니다. 새로운 상태를 추가할 때는 컴파일러가 새로운 경우 처리를 요구합니다.

장점:

  • 모든 상태를 안전하게 처리.
  • 케이스를 놓칠 경우 컴파일 오류 발생.

단점:

  • 시스템 확장 시 sealed 클래스의 철저한 업데이트 필요.