자바의
switch
가 있다면 코틀린에는when
이 있다.
이번 글에서는when
에 대해서 작성해볼 예정이다.
if
문은 두 가지 가능성 중 하나를 선택하게 해 준다는 것을 우리는 알고 있다. 그리고 여러 개의 if문을 사용해서 순차적으로 검사하면서 여러 개 중 하나를 선택할 수 있다.
fun hexDigit(n:Int):char{
if(n in 0..9) return '0'+n
else if(n in 10..15) return 'A'+n-10
else return '?'
}
하지만 여러 대안중 하나를 선택할 수 있는 기능이 있다면
여러 개의 if 문을 사용하는 것보단 훨씬 간결하게 코드를 짤 수 있을것이다.
이러한 기능을 제공해 주는 것이 바로 when
이다.
fun hexDigit(n:Int) char{
when{
n in 0..9 -> return '0'+n
n in 10..15 -> return 'A'+n-10
else -> return '?'
}
}
기본적으로 when문은 when 키워드 다음에 블록이 오고 블록 안에는 조건 -> 문 형태로 된 여러 개의 가지와
else -> 문 형태로 된 한 가지가 구성되어 있다.
만약 모든 조건이 거짓이라면 else 부분을 실행한다.(else 가지가 없다면 아무런 부분이 실행되지 않고 when 문이 끝남)
앞의 글에서 코틀린에서 if를 식으로 사용할 수 있다고 배웠었다.
when도 if처럼 식으로 쓸 수 있다. 당연히 if가 식으로 사용할 때와 동일하게 else
문을 반드시 포함해줘야 한다.
fun hexDigit(n:Int)=when{
n in 0..9 -> '0'+n
n in 10..15-> 'A'+n-10
else -> '?'
}
🔎자바 switch VS 코틀린 when
코틑린 when 여러
대안 중 하나를 선택한다는 점에서 자바 switch
와 비슷하다고 볼 수 있지만
가장 중요한 차이는 when에서는 임의의 조건을 검사할 수 있지만 switch에서는 주어진 식의 여러 가지 값 중 하나만 선택할 수 있다는 점이다.
추가로 자바의 switch 문은 폴스로(fall-through)라는
의미를 제공한다.
⚡폴스로(fall-through)
어떤 조건을 만족할 때 프로그램이 해당 조건에 대응하는 문을 실행하고 명시적으로 break를 만날 때까지 그 이후의 모든 가지를 실행하는데, 이를 폴스로라고 한다.
코틀린 when은 조건을 만족하는 가지만 실행하고 절대 폴스루 하지 않는다.
fun numberPrint(n :Any): String = when{
n==0 -> "ZERO"
n in 1..3 -> "Small"
n in 4..9 -> "Medium"
n in 10..100 -> "Large"
n in Int.MIN_VALUE until 0 -> "Negative"
else -> "Huge"
}
위 함수에서 모든 가지에서 연산의 대상이 n 뿐이므로 이런 경우 아래와 같이 쓸 수 있다.
fun numberPrint(n :Any): String = when (n) {
0 -> "ZERO"
in 1..3 -> "Small"
in 4..9 -> "Medium"
in 10..100 -> "Large"
in Int.MIN_VALUE until 0 -> "Negative"
else -> "Huge"
}
⚡when은 식의 대상을 변수
에 연결해서 사용할 수 있다.
훨씬 깔끔하고 보기 좋은 코드를 짤 수 있다!!
fun readHexDigit()=when(val n=readLine()!!.toInt()){
in 0..9 -> '0'+n
in 10..1015 -> 'A'+n-10
else -> '?'
}
하지만 이때 정의한 변수는 when 블록 내에서만 사용 가능하며 var
로 선언할 수는 없다.
✔정리
- 코틀린의 when은 자바의 switch와 여러 대안 중 하나를 선택한다는 점에서 비슷하다.
- 하지만 when은 임의의 조건을 검사할 수 있고, 폴 스루를 하지 않는다는 점에서 차별점을 가진다.
- 여기서 폴 스루는 해당 조건에 대응하는 문을 실행했지만 break를 만날 때까지 모든 가지를 실행한다는 의미이다.
- 하지만 when은 임의의 조건을 검사할 수 있고, 폴 스루를 하지 않는다는 점에서 차별점을 가진다.
- when은 조건-> 문 형태로 된 여러 개의 가지와 else -> 문 형태로 된 하나의 가지로 구성된다.
- when도 if처럼 식으로 사용할 수 있다.
- 단 if 처럼 else문을 반드시 포함시켜야 한다.
- when 식 의 대상을 변수에 연결하여 사용 가능하다.
- 단 정의된 변수는 when 블록 내에서만 사용 가능하고, var로 선언할 수는 없다.
'Skils > Kotlin' 카테고리의 다른 글
[Kotlin] break & continue, 내포된 루프와 레이블 (0) | 2022.08.17 |
---|---|
[Kotlin] 반복문 while, do-while, for (0) | 2022.08.17 |
[Kotlin] 조건문 if & 범위,진행,연산 (0) | 2022.08.17 |
[Kotlin] vararg(가변인자) (0) | 2022.08.12 |
[Kotlin] 오버로딩과 디폴트값 (0) | 2022.08.10 |