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 등)의 실행 부분이 {} 블록인 경우 마지막 값이 결과값으로 취급됨


