enum & when
enum
java = enum
kotlin = enum class
- kotlin에서 enum은 soft keyword로, 'class' 앞에 있을 때는 특별한 의미지만 그 외에는 이름에 사용할 수 있다.
- 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);
// enum class 안에 메소드를 정의하는 경우
// 반드시 상수와 메소드 사이에 세미콜론으로 구분하여야 한다.
fun rgb() = (r * 256 + g) * 256 + b
}
println(Color.BLUE.rgb())
-> 255
when
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
- Java와 달리 각 분기 끝에 break 필요 X
// 한 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")
}
가독성이 떨어지기는 하지만 메모리상으로는 더 효율적이다.
- when에 인자가 없으려면 각 분기의 조건이 bool값을 계산하는 식이어야 한다.
Author And Source
이 문제에 관하여(enum & when), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@twnthbb/enum-when저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)