Java의 switch - case 와 대응된다. 하지만 Kotlin 에서는 표현식으로 사용될 수 있어 값을 할당 할 수 있다.
Kotlin의 is 는 Java의 instanceOf 와 비슷하다.
처리해야 되는양이 많을때는 { } 블럭으로 묶는데, 그걸 표현식으로 사용할때에는 제일 마지막 라인의 값을 반환한다.
when 을 표현식으로 사용할 경우에는 항상 else 를 사용한다. (enum 제외, 표현식이라는 것은 뭔가 값에 할당을 한다는 의미.)
when 으로 type 을 분기하면 별도로 casting 을 하지 않아도 된다. (smart casting 내가 이미 한번 값을 받아왔다면 굳이 그걸 다시한번 캐스팅 하지 않아도 된다. 굉장히 유용한 기능. 이러한 부분에서 자바와의 차이점이 보인다.)
//javaint x =1;switch(x) {case1:System.out.println(1);break;case2:System.out.println(2);break;default:System.out.println(default);break;}
//kotlinval x =1when { 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 =1when(x) {parseInt(s) ->print("s encodes x")else->print("s does not encode x")}funparseInt(value: String): Int=1//4.val x =129val validNumbers =100..120//when의 조건에 표현식이 들어갈 수 있다.when(x) {in1..10->println("x is in the range")in validNumbers ->println("x is valid")!in10..20->println("x is outSide the range")else->println("none of the above")}
publicvoidtest(Object obj) {if(obj instanceOf String) {System.out.println((String)obj.startWith("preFix")); //기존의 자바에서는 캐스팅을 한번 더 할 수 밖에는 없었다. } elseif(obj instanceOf Integer) {Integer.valueOf(String.valueOf(obj)); //여기도 } elseif (obj instanceOf JavaPerson) { ((JavaPerson)obj).getName(); //여기도 }}
//kotlin//when이 표현식이기 때문에 {}로 묶어서 변수등에 값을 할당해 줄 수 있다.funtest(x: Any): Any=when(x) {is String -> x.startWith("preFix") //smartCasting, is는 자바의 instanceOf에 대응되는 녀석.is Int -> x +3//smartCastingis Person -> x.name //smartCastingelse->false}