enum?
enum class Color{
RED, ORANGE, YEELOW, GREEN, BLUE, VIOLET
}
흔히, java에서 사용시, enum값 내부에 멤버 변수를 설정하기도 한다.
enum class Color(val r:Int, val g:Int, val b:Int){
RED(255,0,0), ORANGE(255,165,0) ... VIOLET(238,130,238);
fun rgb() = (r*256 +g) * 256 + b
}
fun main(args : Array){
println(Color.BLUE.rgb())
}
enum 내부에 값과 함수를 정의했다.
코틀린에선 기본적으노 ;를 사용하지 않지만 enum의 마지막에는 꼭 사용해야한다.
when은 자바와 다르게 좀 더 확장성 있게 object를 지원한다.
enum은 java에서도 지원하고 당연히 kotlin에서 지원한다.
fun getMnemonic(color: Color) =
when (color) {
Color.RED -> "R"
Color.ORANGE -> "O"
Color.YELLOW -> "Y"
Color.BLUE -> "B"
}
fun main(args: Array){
println(getMnemonic(Color.BLUE))
}
when의 특징 = break;를 넣지 않는다는점.
그래서 break를 빼먹어 생기는 오류를 막을 수 있다.
만약 여러 값을 하나의 분기로 처리하고자 한다면 ","를 써서 사용하자.
아래처럼.
fun getMnemonic(color: Color) =
when (color) {
Color.RED, Color.WHITE -> "R,W"
Color.ORANGE -> "O"
Color.YELLOW, COLOR.PURPLE -> "Y,P"
Color.BLUE -> "B"
}
when은 object를 인자로 받을 수 있기에 아래와 같이 사용된다.
fun mix(c1: Color, c2: Color) =
when (setOf(c1,c2)){
setOf(RED,YELLOW) -> ORANGE
setOf(YELLOW,BLUE) -> GREEN
else -> throw Exception("black")
}
setOf는 hastset으로 보면된다.
when에 인자가 없는 코드라면 조건부분은 반드시 boolean을 반환하는 expression이여야 한다.
? = object의 타입 확인과 변환을 한번에 해주는 기능이다.
interface Expr
class Num(val value :Int) : Expr
class Sum(val left:Expr, val right:Expr) : Expr
fun eval(e : Expr) : Int {
if(e is Num) { //smart cast
val n = e as Num //e를 num 타입을 전환하지만 이미 num타입이다.
return n.value
}
if(e is Sum){ //smart cast
//이미 e는 sum type으로 변환된 상태.
return eval(e.right) + eval(e.left)
}
}
is는 instanceof같은 역할이며 as는 강제 캐스팅이라고 보면 된다.
코드 간소화
fun eval(e : Expr) : Int {
when(e) {
is Num ->
e.value
is Sum ->
eval(e.right) + eval(e.left)
}
}
when을 사용하여 코드 간소화를 진행할 수 있다.
if문과 when에서 블럭을 사용할 경우, 마지막 문장이 블럭 전체의 결과값이 된다.
fun ex(e:Expr) : Int =
when(e) {
is Num -> {
println("somtehing")
e.value
}
is Sum -> {
val left = ex(e.left)
val right = ex(e.right)
left+right
}
}