when

  • Java의 switch - case 와 대응된다. 하지만 Kotlin 에서는 표현식으로 사용될 수 있어 값을 할당 할 수 있다.

  • Kotlin의 is 는 Java의 instanceOf 와 비슷하다.

  • 처리해야 되는양이 많을때는 { } 블럭으로 묶는데, 그걸 표현식으로 사용할때에는 제일 마지막 라인의 값을 반환한다.

  • when 을 표현식으로 사용할 경우에는 항상 else 를 사용한다. (enum 제외, 표현식이라는 것은 뭔가 값에 할당을 한다는 의미.)

  • when 으로 type 을 분기하면 별도로 casting 을 하지 않아도 된다. (smart casting 내가 이미 한번 값을 받아왔다면 굳이 그걸 다시한번 캐스팅 하지 않아도 된다. 굉장히 유용한 기능. 이러한 부분에서 자바와의 차이점이 보인다.)

//java
int x = 1;
switch(x) {
    case 1 :
        System.out.println(1);
        break;
    case 2 :
        System.out.println(2);
        break;
    default :
        System.out.println(default);
        break;
}
//kotlin
val x = 1

when {
    x == 1 -> print("x == 1")
    x == 2 -> print("x == 2")
    else -> {
        print("x is neither 1 nor 2")
    }
}

//위에 조건을 줄여서 표기도 가능하다
// 1.
when(x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> {
        print("x is neither 1 nor 2")
    }
}

//2.
when(x) {
    0, 1 -> print("x == 0 or x == 1")
    else -> print("otherwise")
}

//3.
val s = "1"
val x = 1

when(x) {
    parseInt(s) -> print("s encodes x")
    else -> print("s does not encode x")
}

fun parseInt(value: String): Int  = 1


//4.
val x = 129
val validNumbers = 100..120

//when의 조건에 표현식이 들어갈 수 있다.
when(x) {
    in 1..10 -> println("x is in the range")
    in validNumbers -> println("x is valid")
    !in 10..20 -> println("x is outSide the range")
    else -> println("none of the above")
}

public void test(Object obj) {
    if(obj instanceOf String) {
        System.out.println((String)obj.startWith("preFix")); //기존의 자바에서는 캐스팅을 한번 더 할 수 밖에는 없었다.
    } else if(obj instanceOf Integer) {
        Integer.valueOf(String.valueOf(obj));                //여기도
    } else if (obj instanceOf JavaPerson) {
        ((JavaPerson)obj).getName();                         //여기도
    }
}
//kotlin
//when이 표현식이기 때문에 {}로 묶어서 변수등에 값을 할당해 줄 수 있다.
fun test(x: Any): Any = when(x) {
    is String -> x.startWith("preFix")  //smartCasting, is는 자바의 instanceOf에 대응되는 녀석.
    is Int -> x + 3                     //smartCasting
    is Person -> x.name                 //smartCasting
    else -> false
}

Last updated