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
}