Kotlin | eunu & when if & 스마트 형변환

DoItDev·2021년 8월 10일
0
post-thumbnail

enum & when

enum

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 방식이다.
프로퍼티와 메서드 선언 가능 ﴾메서드 선언시 마지막 열거 값 뒤에 세미콜론 필요﴿

스크린샷 2021-08-10 오후 10 05 30

when

자바의 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"
    }
}

when 식은 객체의 동등성 사용

fun mix(c1: Color, c2: Color) = 
when (setOf(c1, c2)) { 
	setOf(RED, YELLOW)> ORANGE 
	setOf(YELLOW, BLUE)> GREEN 
	else> throw Exception("Dirty color") 
} 

인자 없는 when 식

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 키워드의 경우 강제 성이 부여된다. (지향하지는 말자!)

if 와 when의 블록

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") 
	} 
profile
Back-End Engineer

0개의 댓글