java = enum
kotlin = enum class
// 일반 클래스와 마찬가지로 생성자, 프로퍼티 선언
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);
// enum class 안에 메소드를 정의하는 경우
// 반드시 상수와 메소드 사이에 세미콜론으로 구분하여야 한다.
fun rgb() = (r * 256 + g) * 256 + b
}
println(Color.BLUE.rgb())
-> 255
java의 switch에 해당
// 함수의 반환값으로 when 식을 직접 사용
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"
}
println(getMnemonic(Color.BLUE))
-> Battle
// 한 when 분기 안에 복수의 값 사용 가능
fun getWarmth(color: Color) = when(color) {
Color.RED, Color.ORANGE, Color.YELLOW -> "warm"
Color.GREEN -> "natural"
Color.BLUE, Color.INDIGO, Color.VIOLET -> "cold"
}
인자가 없는 when
-> 인자가 없는 when 식을 사용하면 when식 호출 때마다 불필요한 객체 생성을 막을 수 있다.
fun mixOptimized(c1: Color, c2: Color) = when{
(c1 == Color.RED && c2 == Color.YELLOW) || (c1 == Color.YELLOW && c2 == Color.RED) -> Color.ORANGE
(c1 == Color.YELLOW && c2 == Color.BLUE) || (c1 == Color.BLUE && c2 == Color.YELLOW) -> Color.GREEN
(c1 == Color.BLUE && c2 == Color.VIOLET) || (c1 == Color.VIOLET && c2 == Color.BLUE) -> Color.INDIGO
else -> throw Exception("Dirty Color")
}
가독성이 떨어지기는 하지만 메모리상으로는 더 효율적이다.