언어(Language)/Kotlin

[Kotlin] 코틀린 조건문(if, when) 활용 및 예제

잇트루 2023. 11. 14. 01:54
반응형

조건문은 프로그램 내에서 특정 조건이 참(true) 또는 거짓(false) 일 때 서로 다른 동작을 실행하기 위해 사용하는 제어문이다. 조건문은 프로그램의 흐름을 조절하고 다양한 상황에 대응할 수 있도록 도와준다. 코틀린은 조건 제어문으로 if 문과 when 식을 제공하고 있다.

 

if 문

if 키워드는 식을 검사해 그 값이 true나 false 중 어느 것인지 알아내고, 그 결과에 따라 작업을 수행한다. 이처럼 참이나 거짓을 표시하는 식은 불리언(Boolean)이라고 한다.

 

코틀린의 if 문의 간단한 사용 예시는 다음과 같다.

fun main() {
    if (1 > 0) {
        println("1은 0보다 크다.")
    }
    
    if (10 < 11) {
        println("10 < 11")
        println("10은 11보다 작다.")
    }
}
// 출력
1은 0보다 크다.
10 < 11
10은 11보다 작다.
  • if 다음에 있는 괄호 식은 반드시 true 또는 false로 평가되어야 한다.
  • 식을 평가한 결과가 true인 경우 중괄호 안에 있는 코드가 실행된다.

 

다음과 같이 불리언 식을 변수로 선언하고 if 문에서 사용할 수도 있다.

fun main() {
    val x: Boolean = 1 >= 1 // true
    
    if (x) {
        println("It's true")
    }
}
// 출력
It's true
  • x는 Boolean이기 때문에 if 문에서 x를 직접 사용하여 검사할 수 있다.
  • >= 연산자는 왼쪽 항이 오른쪽 항보다 크거나 같으면 true를 반환하고, 오른쪽 항보다 작으면 false를 반환한다.
  • <= 연산자는 반대로 오른쪽 항이 왼쪽 항보다 크거나 같으면 true를 반환하고, 왼쪽 항보다 작으면 false를 반환한다.

 

만약, 중괄호 안의 코드가 한 줄인 경우 다음과 같이 사용할 수 있다.

fun main() {
    if (1 > 0) println("1은 0보다 크다.")

    if (10 < 11)
        println("10은 11보다 작다.")
}
// 출력
1은 0보다 크다.
10은 11보다 작다.

 

else 키워드를 사용하면 true인 경우와 false인 경우 모두 처리할 수 있다.

fun main() {
    val n: Int = -1
    
    if (n > 0) {
        println("n은 0보다 크다.")
    } else {
        println("n은 0보다 작거나 같다.")
    }
}
// 출력
n은 0보다 작거나 같다.
  • 위 코드에서 else는 n <= 0가 true인 경우에 대하여 처리한다.

 

else와 if를 함께 사용하여 추가적으로 조건을 검사할 수 있다.

fun main() {
    val n: Int = 0
    
    if (n > 0) {
        println("n은 0보다 크다.")
    } else if (n == 0) {
        println("n은 0이다.")
    } else {
        println("n은 0보다 작다.")
    }
}
// 출력
n은 0이다.
  • ==을 사용해 두 수가 같은지 동등성 비교 한다.
  • 두 수가 다른지를 검사하기 위해서는 !=를 사용할 수 있다.

 

부정 연산자 !는 논리식을 반전한 결과를 내놓는다.

fun main() {
    val x: Boolean = false
    
    if (!x) {
        println("!x는 true다.")
    }
}
// 출력
!x는 true다.

 

코틀린에서는 if 문장 전체를 식으로 표현할 수 있다.

fun main() {
    val n: Int = 10
    val result = if (n > 100) true else false
    println(result)
}
// 출력
false
  • n은 100보다 작으므로 result에는 Boolean 타입인 false가 저장된다.

 

if 문장을 식으로 활용할 수 있기 때문에 다음과 같이 함수로 작성하여 활용할 수 있다.

fun trueOrFalse(exp: Boolean): String {
    if (exp) {
        return "It's true"
    }

    return "It's false"
}

fun main() {
    val n: Int = 10
    println(trueOrFalse(n >= 5))
    println(trueOrFalse(n < 10))
}
// 출력
It's true
It's false
  • trueOrFalse() 함수는 Boolean 타입의 exp를 입력받아 if 문으로 exp가 참인지 검사한다.
  • main() 함수에서 사용한 trueOrFalse() 함수는 n ≥ 5, n < 10가 차례로 exp가 되어 n을 검사한다.

 

식 본문을 활용하면 return을 생략하고 if 문을 사용하여 결과를 반환할 수 있다.

fun trueOrFalse(exp: Boolean): String =
    if (exp) {
        "It's true"
    } else {
        "It's false"
    }
}

fun main() {
    val n: Int = 10
    println(trueOrFalse(n >= 5))
    println(trueOrFalse(n < 10))
}
// 출력
It's true
It's false

 

 

when 식

when 식은 세 가지 이상의 선택지가 있는 경우 사용하면 if 문보다 더욱 간결하게 코드를 작성할 수 있다. when 식은 어떤 값을 여러 가지 가능성과 비교해 선택한다. 다른 프로그래밍 언어의 switch 문 사용 방법과 매우 유사하지만 보다 간결하다.

 

when 식의 사용 방법은 다음과 같다.

fun main() {
    val n = 30

    when (n) {
        10 -> println("ten")
        20 -> println("twenty")
        30 -> println("thirty")
        else -> println("else")
    }
}
// 출력
thirty
  • n이 화살표(->) 왼쪽의 식과 가장 먼저 일치하는 곳의 화살표 오른쪽의 식을 실행하고 when 식이 끝난다.
  • else는 일치하는 식이 없을 때 나머지에 대한 처리를 담당한다.

 

when 식 괄호 안에 값을 생략하고 식을 활용하여 조건 처리가 가능하며, 값을 리턴하지 않는 when 식은 else 생략이 가능하다.

fun main() {
    val n = 30

    when {
        n < 30 -> println("n은 30보다 작다.")
        n > 30 -> println("n은 30보다 크다.")
        n == 30-> println("n은 30이다.")
    }
}
// 출력
n은 30이다.

 

when 식의 결과를 변수에 담을 수 있다.

fun main() {
    val n = 30

    val result = when(n) {
        10 -> "n은 10이다."
        20 -> "n은 20이다."
        30 -> "n은 30이다."
        40 -> "n은 40이다."
        50 -> "n은 50이다."
        else -> "n은 10, 20, 30, 40, 50이 아닌 값이다."
    }

    println(result)
}
// 출력
n은 30이다.

 

when 식 또한 if 문과 같이 결과를 반환하는 용도로 사용할 수 있다.

fun expOrElse(exp: Boolean): String {
    when {
        exp -> return "It's true"
        else -> return "It's false"
    }
}

fun main() {
    val n: Int = 10
    println(expOrElse(n >= 5))
    println(expOrElse(n < 10))
}
// 출력
It's true
It's false
  • 값을 리턴하는 용도로 사용할 경우 else를 반드시 사용하여 모든 조건에 대한 처리를 정의해야 한다.

 

return을 when 식 앞에 두어 중복된 return 사용을 하지 않아도 된다.

fun returnWhen(n: Int): String {
    return when(n) {
        10 -> "n은 10이다."
        20 -> "n은 20이다."
        30 -> "n은 30이다."
        40 -> "n은 40이다."
        50 -> "n은 50이다."
        else -> "n은 10, 20, 30, 40, 50이 아닌 다른 값이다."
    }
}

fun main() {
    println(returnWhen(60))
}
// 출력
n은 10, 20, 30, 40, 50이 아닌 다른 값이다.

 

식 본문을 활용하여 return 생략도 가능하다.

fun trueOrFalse(exp: Boolean): String =
    when (exp) {
        true -> "It's true"
        false -> "It's false"
    }

fun main() {
    val n: Int = 10
    println(trueOrFalse(n >= 5))
    println(trueOrFalse(n < 10))
}
// 출력
It's true
It's false
  • 이 경우 값을 반환하는 용도로 사용하지만, true, false를 통해 모든 조건에 대한 처리를 했기 때문에 else를 사용하지 않아도 된다.

 

when 식은 다양한 패턴으로 값을 비교할 수 있으며, 여러 조건을 동시에 처리할 수 있다.

fun checkNumberType(x: Int): String {
    return when (x) {
        0 -> "0"
        1, 2 -> "1 또는 2"
        in 3..9 -> "3 ~ 9"
        in 10..99 -> "두 자리 숫자"
        else -> "세 자리 이상의 숫자"
    }
}

fun main() {
    println(checkNumberType(34))
}
// 출력
두 자리 숫자

 

처리해야 할 구문이 여러 줄인 경우 중괄호를 사용하여 처리할 수 있다.

fun main() {
    val n = 30

    when (n) {
        30 -> {
            println("n은 30이다.")
            println("30은 10보다 크다.")
            println("30은 40보다 작다.")
        }
        20 -> {
            println("n은 20이다.")
            println("20은 10보다 크다.")
            println("20은 30보다 작다.")
        }
        10 -> {
            println("n은 10이다.")
            println("10은 20보다 작다.")
        }
    }
}
// 출력
n은 30이다.
30은 10보다 크다.
30은 40보다 작다.

 

 

정리

  • if 문과 when 식은 특정 조건에 대한 처리를 할 수 있다.
  • when 식은 if 문과 비교하여 좀 더 확장된 형태의 조건 처리가 가능하다.
  • 조건이 두 가지 이하인 단순한 경우 if 문을 활용하고, 세 가지 이상인 경우 when 식을 활용하는 것이 좋다.

 

 

참고 서적

https://link.coupang.com/a/bfViFU

 

아토믹 코틀린:코틀린 컴파일러 개발자가 알려주는 코틀린 기본기 87

COUPANG

www.coupang.com

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

반응형