[Java/Kotlin] Enum, When

Jay·2021년 1월 13일
0

Java&Kotlin

목록 보기
6/30
post-thumbnail

Enum

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 with 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 사용

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이여야 한다.


Smart Cast

? = 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
        }
    }
profile
developer

0개의 댓글