Backend
home

5. 코틀린의 선택과 표현 처리(when, enum)

생성일
2025/01/30 14:56
태그
Kotlin

enum

when을 사용할 때는 enum이 필수적이다.
// 가장 간결한 enum class enum class Color { RED, ORANGE, YELLOW, GREEN } // 프로퍼티와 메소드를 갖는 enum class enum class Color(val r: Int, val g: Int, val b: Int) { RED(255, 0, 0), ORANGE(255, 166, 0), YELLOW(255, 255, 0), GREEN(0, 255, 0); fun rgb() = (r * 256 + g) * 256 + b }
Kotlin
복사

when 으로 enum 클래스 다루기

각 색상에 해당하는 한글을 가져오는 함수
// 하나의 값에 1:1 조건 fun getKoreanColor(color: Color):String = when (color) { RED -> "빨강" ORANGE -> "오렌지" YELLOW -> "노랑" GREEN -> "녹색" } // 다중 값 조건 fun getKoreanColor(color: Color) = when (color) { RED, ORANGE -> "빨강 또는 오렌지" YELLOW -> "노랑" GREEN, BLUE -> "녹색 또는 파랑색" }
Kotlin
복사
enum의 모든 구성요소를 나열하지 않거나 else가 없을 경우 컴파일 오류가 발생
java에서는 if 조건식 또는 switch 문으로 처리 시 신규 요소가 추가되면 해당 조건을 모두 직접 찾아야 함
else를 쓰지 않고 모든 요소를 나열하면 신규 요소가 생겼을 때 해당 로직을 추가하기가 쉬움
인자가 없는 when
fun mix(c1: Color, c2: Color) = when { c1 == RED && c2 == YELLOW -> "오렌지" c1 == YELLOW && c2 == BLUE -> "녹색" else -> throw RuntimeException() }
Kotlin
복사
if else if else 문장과 동일한 구조
조건식이 길지 않고 유사도가 높은 경우에 간혹 사용
when으로 스마트 캐스트 → 타입 검사와 타입 캐스트가 동시에!
package ch03 sealed class Person( val name: String, var isMarried: Boolean ) class Developer( name: String, isMarried: Boolean, val language: String ) : Person( name, isMarried ) class Marketer( name: String, isMarried: Boolean, val division: Division ) : Person( name, isMarried ) enum class Division { CONTENTS, DIGITAL, BRAND } fun getSpecialSkill(person: Person) = when (person) { // smart case 덕분에 Developer로 추가 형변환 필요 없이 language 프로퍼티 사용 is Developer -> person.language // smart case 덕분에 Marketer로 추가 형변환 필요 없이 division 프로퍼티 사용 is Marketer -> person.division }
Kotlin
복사
인터페이스의 구현체가 여러개이거나, 상속받은 클래스가 여러 개인 경우 타입 검사 필요
Java : 타입 검사 후, 명시적 형변환이 반드시 필요
Kotlin : 타입 검사할 때 자동으로 형변환까지 진행(smart cast)
직접 형변환도 가능 : val dev = person as Developer
if문에서의 스마트 캐스트
fun getSpecialSkill(person: Person): String = if (person is Developer) { println(person.language) person.language } else if (person is Marketer) { print(person.division) person.division.name } else throw RuntimeException()
Kotlin
복사
조건(if, when 등)의 실행 부분이 {} 블록인 경우 마지막 값이 결과값으로 취급됨