package base
[1]
enum class COLOR {
RED, ORANGE, YELLO
}
[2]
enum class COLOR2(var r: Int, var g: Int, var b: Int) {
RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0),
BLUE(0, 0, 255), VIOLET(238, 130, 238);
fun rgb() = (r * 256 + g) * 256 + b
}
fun main(args: Array<String>) {
println(COLOR2.BLUE.rgb())
}
[1] 은 기본적인 Color enum class 방식이다.
[2]은 생성자값을주어서 값을 가지고 오게 해는 방식의 enum 방식이다.
프로퍼티와 메서드 선언 가능 ﴾메서드 선언시 마지막 열거 값 뒤에 세미콜론 필요﴿
자바의 switch와 유사, when은 식 각 분기에 break 필요 없음
[1]
fun getWarmth(color: Color) = when (color) {
Color.RED ‐> "warm"
Color.ORANGE ‐> "warm"
Color.YELLOW ‐> "warm"
Color.BLUE ‐> "cold"
Color.VIOLET ‐> "cold"
}
[2]
fun getWarmth(color: Color) =
when (color) {
Color.RED, Color.ORANGE, Color.YELLOW ‐> "warm" Color.BLUE, Color.VIOLET ‐> "cold"
}
[3]
fun pickColor(color: COLOR2) {
when (color) {
COLOR2.ORANGE -> "warm"
COLOR2.BLUE -> "blue"
COLOR2.RED -> "red"
else -> "none"
}
}
fun mix(c1: Color, c2: Color) =
when (setOf(c1, c2)) {
setOf(RED, YELLOW) ‐> ORANGE
setOf(YELLOW, BLUE) ‐> GREEN
else ‐> throw Exception("Dirty color")
}
fun mixOpt(c1: Color, c2: Color) =
when {
c1 == RED && c2 == YELLOW ‐> ORANGE
c1 == YELLOW && c2 == RED ‐> ORANGE
c1 == YELLOW && c2 == BLUE ‐> GREEN
else ‐> throw Exception("Dirty color")
}
when에 인자가 없으려면, 각 분기의 조건이 불리언 결과를 계산하는 식이어야 함
package base
fun cast(num: Any) {
if (num is Int) {
var i = num as Number
println("Int case $i")
}
if (num is String) {
println("String case sucess")
}
}
fun main(args: Array<String>) {
var n = 100
cast(n)
cast("test")
}
스마트 캐스트 에서
is
키워드를 사용하여 타입을 체크 하는 방법이 가장 이상적인 방법중 하나이다.
as
키워드의 경우 강제 성이 부여된다. (지향하지는 말자!)
fun evalWithLogging(e:Expr):Int=
when(e){
isNum‐>{
println("num:${e.value}")
e.value//결과
}
isSum‐>{
valleft=evalWithLogging(e.left)
valright=evalWithLogging(e.right)
println("sum:$left+$right")
left+right//결과
}
else‐>
throwException("UnknownExp")
}