728x90
반응형
enum 클래스 정의
자바와 마찬가지로 enum은 단순히 값만 열거하는 존재가 아님
enum 클래스 안에도 프러퍼티나 메소드를 정의할 수 있음
enum class Color(
val r: Int, val g: Int, val b: Int
) {
RED(255, 0, 0), ORANGE(255, 165, 0),
YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255),
INDIGO(75, 0, 130), VIOLET(238, 130, 238);
fun rgb() = (r * 256 + g) * 256 + b
}
enum 클래스 안에 메소드를 정의하는 경우 반드시 enum 상수 목록과 메소드 정의 사이에 세미콜론을 넣어야 함
when으로 enum 클래스 다루기
자바의 switch와 달리 when 절에서는 각 분기의 끝에 break를 넣지 않아도 됨
fun getMnemonic(color: Color) =
when (color) {
Color.RED -> "Richard"
Color.ORANGE -> "Of"
Color.YELLOW -> "York"
Color.GREEN -> "Gave"
Color.BLUE -> "Battle"
Color.INDIGO -> "In"
Color.VIOLET -> "Vain"
}
when과 임의의 객체를 함께 사용
코틀린에서 when은 자바의 switch보다 훨씬 더 강력함
분기 조건에 상수만을 사용할 수 있는 자바 switch와 달리 코틀린 when의 분기 조건은 임의의 객체를 허용함
fun mix(c1: Color, c2: Color) =
when (setOf(c1, c2)) {
setOf(RED, YELLOW) -> ORANGE
setOf(YELLOW, BLUE) -> GREEN
setOf(BLUE, VIOLET) -> INDIGO
else -> throw Exception("Dirty color")
}
인자 없는 when 사용
이전의 함수는 비교대상을 Set 인스턴스를 통해 생성함
보통은 이런 비효율성이 크게 문제가 되지 않음
하지만 이 함수가 아주 자주 호출된다면 불필요한 가비지 객체가 늘어나기에 이를 방지하기 위해 함수를 고쳐 쓰는 편이 나음
fun mixOptimized(c1: Color, c2: Color) =
when {
(c1 == RED && c2 == YELLOW) ||
(c1 == YELLOW && c2 == RED) ->
ORANGE
(c1 == YELLOW && c2 == BLUE) ||
(c1 == BLUE && c2 == YELLOW) ->
GREEN
(c1 == BLUE && c2 == VIOLET) ||
(c1 == VIOLET && c2 == BLUE) ->
INDIGO
else -> throw Exception("Dirty color")
}
추가 객체를 만들지 않는다는 장점이 있지만 가독성은 더 떨어짐
스마트 캐스트: 타입 검사와 타입 캐스트를 조합
코틀린에서는 is를 사용해 변수 타입을 검사함
is 검사는 자바의 instanceof와 비슷
하지만 자바에서 어떤 변수의 타입을 instanceof로 확인한 다음에 그 타입에 속한 멤버에 접근하기 위해서는 명시적으로 변수 타입을 캐스팅해야 함
코틀린에서는 프로그래머 대신 컴파일러가 캐스팅을 해줌
이를 스마트캐스트라고 함
fun eval(e: Expr): Int {
if (e is Num) {
val n = e as Num
return n.value
}
if (e is Sum) {
return eval(e.right) + eval(e.left)
}
throw IllegalArgumentException("Unknown expression")
}
리팩토링: if를 when으로 변경
코틀린에서는 if가 값을 만들어내기 때문에 자바와 달리 3항 연산자가 따로 없음
fun eval(e: Expr): Int =
if (e is Num) {
e.value
} else if (e is Sum) {
eval(e.right) + eval(e.left)
} else {
throw IllegalArgumentException("Unknown expression")
}
when 식을 앞에서 살펴본 값 동등성 검사가 아닌 다른 기능에도 쓸 수 있음
fun eval(e: Expr): Int =
when (e) {
is Num ->
e.value
is Sum ->
eval(e.right) + eval(e.left)
else ->
throw IllegalArgumentException("Unknown expression")
}
반응형
'프로그래밍 > Kotlin' 카테고리의 다른 글
코틀린의 예외 처리 (0) | 2022.01.12 |
---|---|
코틀린 기초(while과 for) (0) | 2022.01.11 |
코틀린 기초(클래스와 프로퍼티) (0) | 2022.01.06 |
코틀린 기초(함수와 변수) (0) | 2022.01.05 |
코틀린 응용 (0) | 2022.01.04 |