Skils/Kotlin

[Kotiln] 조건문 when

재한 2022. 8. 17. 19:39

자바의 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은 조건-> 문 형태로 된 여러 개의 가지와 else -> 문 형태로 된 하나의 가지로 구성된다.
  • when도 if처럼 식으로 사용할 수 있다.
    • 단 if 처럼 else문을 반드시 포함시켜야 한다.
  • when 식 의 대상을 변수에 연결하여 사용 가능하다.
    • 단 정의된 변수는 when 블록 내에서만 사용 가능하고, var로 선언할 수는 없다.