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