Kotlin에서 조건문 작성하기

1. 시작하기 전에

조건문은 프로그래밍의 가장 중요한 요소 중 하나입니다. 조건문은 결정을 처리하는 프로그래밍 언어 명령어입니다. 조건문을 사용하면 코드가 동적으로 실행되므로 코드는 조건에 따라 다르게 동작합니다.

이 Codelab에서는 if/elsewhen 문과 표현식을 사용하여 Kotlin에서 조건문을 작성하는 방법을 설명합니다.

기본 요건

  • 변수, println() 함수, main() 함수를 비롯한 Kotlin 프로그래밍 기본 사항에 관한 지식

학습할 내용

  • 불리언 표현식을 작성하는 방법
  • if/else 문을 작성하는 방법
  • when 문을 작성하는 방법
  • if/else 표현식을 작성하는 방법
  • when 표현식을 작성하는 방법
  • 쉼표를 사용하여 when 조건문에서 여러 브랜치의 공통 동작을 정의하는 방법
  • in 범위를 사용하여 when 조건문에서 다양한 브랜치의 공통 동작을 정의하는 방법
  • is 키워드를 사용하여 when 조건문을 작성하는 방법

필요한 항목

  • Kotlin 플레이그라운드에 액세스할 수 있는 웹브라우저

2. if/else 문을 사용하여 조건 표현

환경이 바뀌면 사람들의 행동도 바뀝니다. 예를 들어 날씨가 추우면 겉옷을 입고 날씨가 따뜻하면 겉옷이 필요하지 않지요.

날씨가 추울 때 내린 결정을 설명하는 플로우 차트 '예' 화살표는 '겉옷을 입으세요' 메시지를 가리키고 '아니요' 화살표는 '겉옷을 입지 마세요' 메시지를 가리킵니다.

의사 결정은 프로그래밍의 기본 개념이기도 합니다. 특정 상황에서 프로그램이 어떻게 동작해야 하는지에 관한 명령을 작성하여 이러한 상황이 발생할 때 적절하게 동작하거나 반응할 수 있도록 합니다. Kotlin에서는 프로그램이 조건에 따라 다른 작업을 실행하도록 하려면 if/else 문을 사용하면 됩니다. 다음 섹션에서는 if 문을 작성합니다.

불리언 표현식으로 if 조건 작성

운전자가 신호등에서 취해야 할 올바른 행동을 알려주는 프로그램을 빌드한다고 생각해 보세요. 첫 번째 조건인 빨간색 신호등에 초점을 맞춥니다. 빨간색 신호등에서 어떻게 하나요? 멈춥니다.

신호등이 빨간색일 때 내리는 결정을 설명하는 플로우 차트 '예' 화살표는 'Stop' 메시지를 가리킵니다.

Kotlin에서는 if 문으로 이 조건을 표현할 수 있습니다. if 문의 구조를 살펴보세요.

if 문을 설명하는 다이어그램. if 키워드와 그 뒤에 한 쌍의 괄호가 있고 괄호 안에 조건이 있습니다. 괄호 뒤에는 중괄호 한 쌍이 있고 그 안에 본문이 있습니다. 조건 블록이 강조표시되어 있습니다.

if 문을 사용하려면 평가하려는 조건 앞에 if 키워드를 사용합니다. 불리언 표현식으로 조건을 표현해야 합니다. 표현식은 값과 변수, 값을 반환하는 연산자로 조합됩니다. 불리언 표현식은 불리언 값을 반환합니다.

이전에는 다음과 같은 할당 연산자를 알아봤습니다.

val number = 1

= 할당 연산자는 number 변수에 1 값을 할당합니다.

반대로 불리언 표현식은 방정식의 양쪽에 있는 값이나 변수를 비교하는 비교 연산자로 구성됩니다. 비교 연산자를 살펴보세요.

1 == 1

== 비교 연산자는 값을 서로 비교합니다. 이 표현식이 반환하는 불리언 값은 무엇일까요?

이 표현식의 불리언 값을 알아보세요.

  1. Kotlin 플레이그라운드를 사용하여 코드를 실행합니다.
  2. 함수 본문에서 println() 함수를 추가하고 1 == 1 표현식을 인수로 전달합니다.
fun main() {
    println(1 == 1)
}
  1. 프로그램을 실행한 후 출력을 확인합니다.
true

첫 번째 1 값은 두 번째 1 값과 같으므로 불리언 표현식은 불리언 값인 true 값을 반환합니다.

직접 해 보기

== 비교 연산자 외에도 불리언 표현식을 만드는 데 사용할 수 있는 비교 연산자가 더 있습니다.

  • 미만: <
  • 초과: >
  • 이하: <=
  • 이상: >=
  • 같지 않음: !=

간단한 표현식을 사용하여 비교 연산자를 사용하는 방법을 연습합니다.

  1. 인수에서 == 비교 연산자를 < 비교 연산자로 바꿉니다.
fun main() {
    println(1 < 1)
}
  1. 프로그램을 실행한 후 출력을 확인합니다.

첫 번째 1 값이 두 번째 1 값보다 작지 않기 때문에 출력에서 false 값이 반환됩니다.

false
  1. 처음 두 단계를 다른 비교 연산자와 숫자를 적용하여 반복합니다.

간단한 if 문 작성

불리언 표현식을 작성하는 방법에 관한 예시를 살펴봤으므로 이제 첫 번째 if 문을 작성할 수 있습니다. if 문의 문법은 다음과 같습니다.

if 문을 설명하는 다이어그램. if 키워드와 그 뒤에 한 쌍의 괄호가 있고 괄호 안에 조건이 있습니다. 괄호 뒤에는 중괄호 한 쌍이 있고 그 안에 본문이 있습니다. 본문 블록이 강조표시되어 있습니다.

if 문은 if 키워드로 시작하고 그 뒤에 조건이 옵니다. 조건은 불리언 표현식으로 괄호로 묶이고 괄호 뒤에는 중괄호 한 쌍이 옵니다. 본문은 일련의 문 또는 표현식으로, 조건 뒤의 중괄호 안에 배치됩니다. 이러한 문 또는 표현식은 조건이 충족될 때만 실행됩니다. 즉, 중괄호 안에 있는 문은 if 브랜치의 불리언 표현식이 true 값을 반환할 때만 실행됩니다.

빨간색 신호등 조건에 관한 if 문을 작성합니다.

  1. main() 함수 내에서 trafficLightColor 변수를 만들고 "Red" 값을 할당합니다.
fun main() {
    val trafficLightColor = "Red"
}
  1. 빨간색 신호등 조건에 관한 if 문을 추가하고 trafficLightColor == "Red" 표현식을 전달합니다.
fun main() {
    val trafficLightColor = "Red"

    if (trafficLightColor == "Red") {

    }
}
  1. if 문 본문에서 println() 함수를 추가하고 "Stop" 인수를 전달합니다.
fun main() {
    val trafficLightColor = "Red"

    if (trafficLightColor == "Red") {
        println("Stop")
    }
}
  1. 프로그램을 실행한 후 출력을 확인합니다.
Stop

trafficLightColor == "Red" 표현식은 true 값을 반환하므로 println("Stop") 문이 실행되어 Stop 메시지가 출력됩니다.

불리언 표현식이자 조건으로 trafficLightColor == "Red"라는 if 문을 강조표시한 다이어그램 다음 줄에는 불리언 표현식이 true일 때만 실행된다고 표시된 println("Stop") 본문이 있습니다.

else 브랜치 추가

이제 신호등이 빨간색이 아닐 때 이동하라고 운전자에게 알리도록 프로그램을 확장할 수 있습니다.

신호등이 빨간색일 때 내리는 결정을 설명하는 플로우 차트 '예' 화살표는 'Stop' 메시지를 가리킵니다. '아니요' 화살표는 'Go' 메시지를 가리킵니다.

if/else 문을 만들려면 else 를 추가해야 합니다. 브랜치는 코드에서 불완전한 부분으로, 문이나 표현식을 만들도록 조인할 수 있습니다. else 브랜치는 if 브랜치 다음에 와야 합니다.

if/else 문을 설명하는 다이어그램. if 키워드 다음에 괄호가 오고 그 안에 조건이 있습니다. 그 뒤에는 중괄호 한 쌍이 오고 그 안에 본문 1이 있으며 중괄호 뒤에는 else 키워드가 옵니다. 그 뒤에는 중괄호 한 쌍이 있고 그 안에 본문 2 블록이 포함되어 있습니다.

if 문의 닫는 중괄호 뒤에 else 키워드, 중괄호 한 쌍을 차례로 추가합니다. else 문의 중괄호 안에 if 브랜치의 조건이 false일 때만 실행되는 두 번째 본문을 추가할 수 있습니다.

프로그램에 else 브랜치를 추가합니다.

  1. if 문의 닫는 중괄호 뒤에 else 키워드, 중괄호 한 쌍을 차례로 추가합니다.
fun main() {
    val trafficLightColor = "Red"

    if (trafficLightColor == "Red") {
        println("Stop")
    } else {

    }
}
  1. else 키워드의 중괄호 안에 println() 함수를 추가하고 "Go" 인수를 전달합니다.
fun main() {
    val trafficLightColor = "Red"

    if (trafficLightColor == "Red") {
        println("Stop")
    } else {
        println("Go")
    }
}
  1. 프로그램을 실행한 후 출력을 확인합니다.
Stop

프로그램은 여전히 else 브랜치를 추가하기 전과 동일한 방식으로 작동하지만 Go 메시지를 출력하지는 않습니다.

  1. trafficLightColor 변수에 Green 값을 재할당합니다. 녹색일 때 운전자가 이동해야 하기 때문입니다.
fun main() {
    val trafficLightColor = "Green"

    if (trafficLightColor == "Red") {
        println("Stop")
    } else {
        println("Go")
    }
}
  1. 프로그램을 실행한 후 출력을 확인합니다.
Go

이제 프로그램에서는 Stop 메시지 대신 Go 메시지를 출력합니다.

불리언 표현식으로 나타낸 trafficLightColor == "Red" 조건이 있는 if/else 문을 강조표시한 다이어그램 println("Stop") 본문은 불리언 표현식이 true일 때만 실행되는 것으로 표시됩니다. else 절 안에는 println("Go") 문이 불리언 표현식이 false일 때만 실행된다고 표시되어 있습니다.

trafficLightColor 변수에 "Green" 값을 재할당했으므로 if 브랜치에서 평가된 trafficLightColor == "Red" 표현식은 false 값을 반환합니다. "Green" 값이 "Red" 값과 같지 않기 때문입니다.

따라서 프로그램은 if 브랜치에 있는 모든 문을 건너뛰고 대신 else 브랜치 내의 모든 문을 실행합니다. 즉, println("Go") 함수는 실행되지만 println("Stop") 함수는 실행되지 않습니다.

else if 브랜치 추가

일반적으로 신호등에는 노란색도 있어 운전자에게 천천히 주행하라고 알립니다. 프로그램의 의사 결정 프로세스를 확장하여 이를 반영할 수 있습니다.

신호등이 빨간색일 때 내리는 결정을 설명하는 플로우 차트 '예' 화살표는 'Stop' 메시지를 가리킵니다. '아니요' 화살표는 신호등이 노란색일 때 내리는 또 다른 결정을 가리킵니다. 이 결정에서 '예' 화살표는 'Slow' 메시지를 가리키고 '아니요' 화살표는 'Go' 메시지를 가리킵니다.

단일 if 및 단일 else 브랜치가 포함된 if/else 문을 사용하여 단일 결정 지점에 적합한 조건문을 작성하는 방법을 알아봤습니다. 결정 지점이 여러 개인 더 복잡한 브랜치를 처리하려면 어떻게 해야 할까요? 결정 지점이 여러 개인 경우 여러 레이어의 조건으로 조건문을 만들어야 합니다. if/else 문에 else if 브랜치를 추가하면 됩니다.

if 브랜치의 닫는 중괄호 뒤에 else if 키워드를 추가해야 합니다. else if 키워드의 괄호 안에 else if 브랜치 조건으로 불리언 표현식을 추가하고 중괄호 안에 본문을 추가해야 합니다. 본문은 조건 1이 실패했지만 조건 2가 충족되는 경우에만 실행됩니다.

if/else 문을 설명하는 다이어그램. if 키워드 다음에 괄호가 오고 그 안에 조건 1 블록이 있습니다. 괄호 뒤에는 중괄호 한 쌍이 있고 그 안에 본문 1이 있습니다.   중괄호 뒤에는 else if 키워드와 괄호가 있고 조건 2 블록이 괄호 안에 포함되어 있습니다. 그 뒤에는 본문 2 블록이 포함된 중괄호 한 쌍이 있습니다.  그리고 else 키워드, 본문 3 블록이 포함된 중괄호가 차례로 이어집니다.

else if 브랜치는 항상 if 브랜치 뒤, else 브랜치 앞에 있습니다. 문에서 여러 else if 브랜치를 사용할 수 있습니다.

if 브랜치와 else 브랜치 사이에 else if 브랜치가 여러 개인 if/else 조건을 보여주는 다이어그램 else if 브랜치가 여러 개라고 나타내는 else if 브랜치에 관한 텍스트 주석

if 문에는 else 브랜치 없이 if 브랜치와 else if 브랜치도 포함될 수 있습니다.

if/else 문을 설명하는 다이어그램. if 키워드 다음에 괄호가 오고 그 안에 조건 1 블록이 있습니다. 괄호 뒤에는 중괄호 한 쌍이 있고 그 안에 본문 1이 있습니다.   중괄호 뒤에는 else if 키워드와 괄호가 있고 조건 2 블록이 괄호 안에 포함되어 있습니다. 그 뒤에는 본문 2 블록이 포함된 중괄호 한 쌍이 있습니다.

프로그램에 else if 브랜치를 추가합니다.

  1. if 문의 닫는 중괄호 뒤에 else if (trafficLightColor == "Yellow") 표현식과 중괄호를 차례로 추가합니다.
fun main() {
    val trafficLightColor = "Green"

    if (trafficLightColor == "Red") {
        println("Stop")
    } else if (trafficLightColor == "Yellow") {

    } else {
        println("Go")
    }
}
  1. else if 브랜치의 중괄호 안에 println() 문을 추가한 후 "Slow" 문자열 인수를 전달합니다.
fun main() {
    val trafficLightColor = "Green"

    if (trafficLightColor == "Red") {
        println("Stop")
    } else if (trafficLightColor == "Yellow") {
        println("Slow")
    } else {
        println("Go")
    }
}
  1. trafficLightColor 변수에 "Yellow" 문자열 값을 재할당합니다.
fun main() {
    val trafficLightColor = "Yellow"

    if (trafficLightColor == "Red") {
        println("Stop")
    } else if (trafficLightColor == "Yellow") {
        println("Slow")
    } else {
        println("Go")
    }
}
  1. 프로그램을 실행한 후 출력을 확인합니다.
Slow

이제 프로그램에서 Stop 또는 Go 메시지 대신 Slow 메시지를 출력합니다.

trafficLightColor == "Red" 조건이 있는 if/else 문을 강조표시하는 다이어그램. if 절은 불리언 표현식 1로 표시되고 trafficLightColor == "Yellow"는 불리언 표현식 2로 표시됩니다. println("Stop") 본문은 불리언 표현식 1이 true일 때만 실행된다고 표시되어 있습니다. println("Slow") 본문은 불리언 표현식 1은 false지만 불리언 표현식 2는 true인 경우에만 실행된다고 표시되어 있습니다. println("Go") 본문은 불리언 문 1과 2가 false일 때만 실행된다고 표시되어 있습니다.

Slow 메시지만 출력하고 다른 줄은 출력하지 않는 이유는 다음과 같습니다.

  • trafficLightColor 변수에 "Yellow" 값이 할당됩니다.
  • "Yellow" 값은 "Red" 값과 같지 않으므로 if 브랜치의 불리언 표현식(이미지에서 1로 표시됨)은 false 값을 반환합니다. 프로그램은 if 브랜치 내의 모든 문을 건너뛰고 Stop 메시지를 출력하지 않습니다.
  • if 브랜치가 false 값을 생성하므로 프로그램은 else if 브랜치 내의 부울 표현식을 평가합니다.
  • "Yellow" 값은 "Yellow" 값과 같으므로 else if 브랜치의 불리언 표현식(이미지에서 2로 표시됨)은 true 값을 반환합니다. 프로그램은 else if 브랜치 내의 모든 문을 실행하고 Slow 메시지를 출력합니다.
  • else if 브랜치의 부울 expressiontrue 값을 반환하므로 프로그램은 나머지 브랜치를 건너뜁니다. 따라서 else 브랜치의 모든 문이 실행되지 않으며 프로그램은 Go 메시지를 출력하지 않습니다.

직접 해 보기

현재 프로그램에 버그가 있다는 사실을 알았나요?

1단원에서는 코드의 구문 오류로 인해 Kotlin에서 코드를 컴파일할 수 없어 프로그램을 실행할 수 없는 컴파일 오류라는 버그 유형을 알아봤습니다. 여기서는 프로그램을 실행할 수는 있지만 의도한 대로 출력을 생성하지 않는 로직 오류라는 또 다른 유형의 버그가 발생합니다.

신호등이 녹색일 때만 운전자가 주행해야 한다고 가정해 보겠습니다. 신호등이 고장 나서 꺼져 있으면 어떻게 하나요? 운전자가 계속 주행해야 하나요? 아니면 문제가 있다는 경고를 전송해야 하나요?

안타깝게도 현재 프로그램에서는 신호등이 빨간색이나 노란색 이외의 다른 색상인 경우 운전자는 여전히 이동하도록 권장받습니다.

다음과 같이 문제를 해결합니다.

  1. trafficLightColor 변수에 "Black" 값을 재할당하여 꺼진 신호등을 나타냅니다.
fun main() {
    val trafficLightColor = "Black"

    if (trafficLightColor == "Red") {
        println("Stop")
    } else if (trafficLightColor == "Yellow") {
        println("Slow")
    } else {
        println("Go")
    }
}
  1. 프로그램을 실행한 후 출력을 확인합니다.
Go

프로그램은 trafficLightColor 변수에 "Green" 값이 할당되어 있지 않아도 Go 메시지를 출력합니다. 이 프로그램이 올바른 동작을 반영하도록 수정할 수 있나요?

신호등이 빨간색일 때 내리는 결정을 설명하는 플로우 차트 '예' 화살표는 'Stop' 메시지를 가리킵니다. '아니요' 화살표는 신호등이 노란색일 때 내리는 또 다른 결정을 가리킵니다. 이 결정에서 '예' 화살표는 'Slow' 메시지를 가리키고 '아니요' 화살표는 신호등이 녹색일 때 내린 또 다른 결정을 가리킵니다. 해당 결정에서 '예' 화살표는 'Go' 메시지를 가리키고 '아니요' 화살표는 'Invalid color' 메시지를 가리킵니다.

프로그램이 출력되도록 수정해야 합니다.

  • Go 메시지는 trafficLightColor 변수에 "Green" 값이 할당될 때만 출력됩니다.
  • Invalid traffic-light color 메시지는 trafficLightColor 변수에 "Red" 또는 "Yellow", "Green" 값이 할당되지 않은 경우에만 출력됩니다.

else 브랜치 수정

else 브랜치는 항상 if/else 문 끝에 있습니다. 포괄적 브랜치이기 때문입니다. 이전 브랜치의 다른 모든 조건이 충족되지 않으면 자동으로 실행됩니다. 따라서 else 브랜치는 특정 조건을 충족하는 경우에만 작업을 실행하려는 경우에는 적합하지 않습니다. 신호등의 경우 else if 브랜치를 사용하여 녹색등의 조건을 지정할 수 있습니다.

else if 브랜치를 사용하여 녹색 신호등 조건을 평가합니다.

  1. 현재 else if 브랜치 뒤에 또 다른 else if (trafficLightColor == "Green") 브랜치를 추가합니다.
fun main() {
    val trafficLightColor = "Black"

    if (trafficLightColor == "Red") {
        println("Stop")
    } else if (trafficLightColor == "Yellow") {
        println("Slow")
    } else if (trafficLightColor == "Green") {
        println("Go")
    }
}
  1. 프로그램을 실행한 후 출력을 확인합니다.

출력이 비어 있습니다. 이전 조건이 충족되지 않으면 실행되는 else 브랜치가 없기 때문입니다.

  1. 마지막 else if 브랜치 뒤에 println("Invalid traffic-light color") 문이 포함된 else 브랜치를 추가합니다.
fun main() {
    val trafficLightColor = "Black"

    if (trafficLightColor == "Red") {
        println("Stop")
    } else if (trafficLightColor == "Yellow") {
        println("Slow")
    } else if (trafficLightColor == "Green") {
        println("Go")
    } else {
        println("Invalid traffic-light color")
    }

}
  1. 프로그램을 실행한 후 출력을 확인합니다.
Invalid traffic-light color
  1. trafficLightColor 변수에 "Red""Yellow", "Green" 외의 다른 값을 할당하고 프로그램을 다시 실행합니다.

프로그램이 어떻게 출력되는지 확인하세요.

명시적 else if 브랜치를 녹색 관련 입력 유효성 검사로 사용하고 else 브랜치를 다른 잘못된 입력을 포착하는 데 사용하는 것이 좋은 프로그래밍 방법입니다. 이렇게 하면 신호등이 녹색일 때만 운전자가 이동하도록 안내합니다. 다른 사례에서는 신호등이 예상대로 작동하지 않는다는 명시적 메시지가 전달됩니다.

3. 여러 브랜치에 when 문 사용

trafficLightColor 프로그램은 조건이 여러 개(브랜치라고도 함)이면 더 복잡하게 보입니다. 더 많은 브랜치가 포함된 프로그램을 단순화할 수 있는지 궁금할 수 있습니다.

Kotlin에서는 여러 브랜치를 다룰 때 if/else 문 대신 when 문을 사용할 수 있습니다. 가독성을 높이기 때문인데 가독성은 일반적으로 개발자인 사람 독자가 얼마나 쉽게 코드를 읽을 수 있는지를 나타냅니다. 코드를 작성할 때는 가독성을 고려하는 것이 매우 중요합니다. 다른 개발자가 전체 기간에 걸쳐 코드를 검토하고 수정해야 할 수 있기 때문입니다. 가독성이 좋으면 개발자가 코드를 올바르게 이해할 수 있으며 실수로 코드에 버그가 발생하지 않도록 합니다.

고려할 브랜치가 3개 이상인 경우 when 문을 사용하는 것이 좋습니다.

when 문 구조를 보여주는 다이어그램 when 키워드로 시작하고 그 뒤 괄호 안에는 매개변수 블록이 포함되어 있습니다. 그 뒤에는 중괄호 안에 사례 세 줄이 포함되어 있습니다. 각 줄에는 조건 블록, 화살표 기호, 본문 블록이 차례로 있습니다. 각 사례 줄은 순차적으로 평가된다고 표시되어 있습니다.

when 문은 매개변수를 통해 단일 값을 허용합니다. 그러면 값이 각 조건을 기준으로 순차적으로 평가됩니다. 충족되는 첫 번째 조건의 상응하는 본문이 실행됩니다. 각 조건과 본문은 화살표(->)로 구분됩니다. if/else 문과 마찬가지로 각 조건과 본문 쌍을 when 문의 브랜치라고 합니다. 또한 if/else 문과 마찬가지로 else 브랜치를 포괄 브랜치로 작동하는 when 문에서 최종 조건으로 추가할 수 있습니다.

when 문으로 if/else 문 다시 작성

신호등 프로그램에는 이미 여러 브랜치가 있습니다.

  • 빨간색 신호등
  • 노란색 신호등
  • 녹색 신호등
  • 기타 신호등 색상

when 문을 사용하도록 프로그램을 변환합니다.

  1. main() 함수에서 if/else 문을 삭제합니다.
fun main() {
    val trafficLightColor = "Black"

}
  1. when 문을 추가하고 trafficLightColor 변수를 인수로 전달합니다.
fun main() {
    val trafficLightColor = "Black"

    when (trafficLightColor) {
    }
}
  1. when 문 본문에서 "Red" 조건, 화살표, println("Stop") 본문을 차례로 추가합니다.
fun main() {
    val trafficLightColor = "Black"

    when (trafficLightColor) {
        "Red" -> println("Stop")
    }
}
  1. 다음 줄에서 "Yellow" 조건, 화살표, println("Slow") 본문을 차례로 추가합니다.
fun main() {
    val trafficLightColor = "Black"

    when (trafficLightColor) {
        "Red" -> println("Stop")
        "Yellow" -> println("Slow")
    }
}
  1. 다음 줄에서 "Green" 조건, 화살표, println("Go") 본문을 차례로 추가합니다.
fun main() {
    val trafficLightColor = "Black"

    when (trafficLightColor) {
        "Red" -> println("Stop")
        "Yellow" -> println("Slow")
        "Green" -> println("Go")
    }
}
  1. 다음 줄에서 else 키워드, 화살표, println("Invalid traffic-light color") 본문을 차례로 추가합니다.
fun main() {
    val trafficLightColor = "Black"

    when (trafficLightColor) {
        "Red" -> println("Stop")
        "Yellow" -> println("Slow")
        "Green" -> println("Go")
        else -> println("Invalid traffic-light color")
    }
}
  1. trafficLightColor 변수에 "Yellow" 값을 재할당합니다.
fun main() {
    val trafficLightColor = "Yellow"

    when (trafficLightColor) {
        "Red" -> println("Stop")
        "Yellow" -> println("Slow")
        "Green" -> println("Go")
        else -> println("Invalid traffic-light color")
    }
}

이 프로그램을 실행하면 어떤 결과가 출력될까요?

  1. 프로그램을 실행한 후 출력을 확인합니다.
Slow

Slow 메시지가 출력되며 그 이유는 다음과 같습니다.

  • trafficLightColor 변수에 "Yellow" 값이 할당됩니다.
  • 프로그램은 각 조건을 하나씩 순서대로 평가합니다.
  • "Yellow" 값이 "Red" 값과 같지 않으므로 프로그램이 첫 번째 본문을 건너뜁니다.
  • "Yellow" 값은 "Yellow" 값과 같으므로 프로그램은 두 번째 본문을 실행하고 Slow 메시지를 출력합니다.
  • 본문이 실행되었으므로 프로그램에서는 세 번째, 네 번째 브랜치를 무시하고 when 문을 종료합니다.

when 문에 더 복잡한 조건 작성

지금까지 trafficLightColor 변수에 "Yellow" 값이 할당될 때와 같이 동일한 단일 조건의 when 조건을 작성하는 방법을 알아봤습니다. 이제 쉼표(,)와 in 키워드, is 키워드를 사용하여 좀 더 복잡한 when 조건을 만드는 방법을 알아봅니다.

1~10 사이의 숫자가 소수인지 결정하는 프로그램을 빌드합니다.

  1. 별도의 창에서 Kotlin 플레이그라운드를 엽니다.

나중에 신호등 프로그램으로 돌아옵니다.

  1. x 변수를 정의하고 3 값을 할당합니다.
fun main() {
    val x = 3
}
  1. 2, 3, 5, 7 조건의 여러 브랜치가 포함된 when 문을 추가하고 각 브랜치에 println("x is prime number between 1 and 10.") 본문을 추가합니다.
fun main() {
    val x = 3

    when (x) {
        2 -> println("x is a prime number between 1 and 10.")
        3 -> println("x is a prime number between 1 and 10.")
        5 -> println("x is a prime number between 1 and 10.")
        7 -> println("x is a prime number between 1 and 10.")
    }
}
  1. println("x is not prime number between 1 and 10.") 본문이 있는 else 브랜치를 추가합니다.
fun main() {
    val x = 3

    when (x) {
        2 -> println("x is a prime number between 1 and 10.")
        3 -> println("x is a prime number between 1 and 10.")
        5 -> println("x is a prime number between 1 and 10.")
        7 -> println("x is a prime number between 1 and 10.")
        else -> println("x isn't a prime number between 1 and 10.")
    }
}
  1. 프로그램을 실행한 후 예상대로 출력되는지 확인합니다.
x is a prime number between 1 and 10.

여러 조건에 쉼표(,) 사용

소수 프로그램에는 println() 문이 많이 반복됩니다. when 문을 작성할 때는 쉼표(,)를 사용하여 동일한 본문에 상응하는 여러 조건을 나타낼 수 있습니다.

when 문 구조를 보여주는 다이어그램 when 키워드로 시작하고 뒤에 오는 괄호 안에는 매개변수 블록이 있습니다. 그 뒤에는 중괄호가 있고 그 안에 사례 두 줄이 포함되어 있습니다. 첫 번째 줄에는 조건 1 블록, 쉼표, 조건 2 블록, 화살표 기호, 본문 블록이 차례로 이어집니다. 두 번째 줄에는 조건 블록, 화살표 기호, 본문 블록이 차례로 있습니다.

이전 다이어그램에서는 첫 번째 또는 두 번째 조건이 충족되면 상응하는 본문이 실행됩니다.

이 개념을 적용해 소수 프로그램을 다시 작성합니다.

  1. 2 조건의 브랜치에서 3, 5, 7을 쉼표(,)로 구분하여 추가합니다.
fun main() {
    val x = 3

    when (x) {
        2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
        3 -> println("x is a prime number between 1 and 10.")
        5 -> println("x is a prime number between 1 and 10.")
        7 -> println("x is a prime number between 1 and 10.")
        else -> println("x isn't a prime number between 1 and 10.")
    }
}
  1. 개별 3, 5, 7 조건의 브랜치를 삭제합니다.
fun main() {
    val x = 3

    when (x) {
        2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
        else -> println("x isn't a prime number between 1 and 10.")
    }
}
  1. 프로그램을 실행한 후 예상대로 출력되는지 확인합니다.
x is a prime number between 1 and 10.

여러 조건에 in 키워드 사용

여러 조건을 나타내는 쉼표(,) 기호 외에도 in 키워드와 when 브랜치의 다양한 값도 사용할 수 있습니다.

when 문 구조를 보여주는 다이어그램 when 키워드로 시작하고 뒤에 오는 괄호 안에는 매개변수 블록이 있습니다. 그 뒤에는 중괄호가 있고 그 안에 사례 두 줄이 포함되어 있습니다. 첫 번째 줄에는 in 키워드, 범위 시작 블록, 점 2개, 범위 끝 블록, 화살표 기호, 본문 블록이 차례로 있습니다. 두 번째 줄에는 조건 블록, 화살표 기호, 본문 블록이 차례로 있습니다.

다양한 값을 사용하려면 범위 시작을 나타내는 숫자, 공백 없이 점 두 개를 차례로 추가하고 범위 끝을 나타내는 또 다른 숫자로 종료합니다.

매개변수의 값이 범위 시작과 범위 끝 사이의 범위에 있는 값과 같으면 첫 번째 본문이 실행됩니다.

소수 프로그램에서 숫자가 1~10 사이에 있지만 소수가 아닌 경우 메시지를 출력할 수 있나요?

in 키워드로 다른 브랜치를 추가합니다.

  1. when 문의 첫 번째 브랜치 뒤에 in 키워드, 1..10 범위, println("x is a number between 1 and 10, but not a prime number.") 본문이 차례로 있는 두 번째 브랜치를 추가합니다.
fun main() {
    val x = 3

    when (x) {
        2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
        in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
        else -> println("x isn't a prime number between 1 and 10.")
    }
}
  1. x 변수를 4 값으로 변경합니다.
fun main() {
    val x = 4

    when (x) {
        2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
        in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
        else -> println("x isn't a prime number between 1 and 10.")
    }
}
  1. 프로그램을 실행한 후 출력을 확인합니다.
x is a number between 1 and 10, but not a prime number.

프로그램은 두 번째 브랜치의 메시지는 출력하지만 첫 번째 브랜치나 세 번째 브랜치의 메시지는 출력하지 않습니다.

다음은 이 프로그램의 작동 방식입니다.

  • x 변수에 4 값이 할당됩니다.
  • 프로그램은 첫 번째 브랜치의 조건을 평가하기 위해 진행됩니다. 4 값은 2 또는 3, 5, 7 값이 아니므로 프로그램은 첫 번째 브랜치의 본문 실행을 건너뛰고 두 번째 브랜치로 진행됩니다.
  • 4 값은 110 사이에 있으므로 x is a number between 1 and 10, but not a prime number. 본문의 메시지가 출력됩니다.
  • 본문이 한 개 실행되었으므로 프로그램은 when 문을 종료하고 else 브랜치를 무시합니다.

is 키워드를 사용하여 데이터 유형 확인

is 키워드를 조건으로 사용하여 평가된 값의 데이터 유형을 확인할 수 있습니다.

when 문 구조를 보여주는 다이어그램 when 키워드로 시작하고 뒤에 오는 괄호 안에는 매개변수 블록이 있습니다. 그 뒤에는 중괄호가 있고 그 안에 사례 두 줄이 포함되어 있습니다. 첫 번째 줄에는 is 키워드, 유형 블록, 화살표 기호, 본문 블록이 차례로 있습니다. 두 번째 줄에는 조건 블록과 화살표 기호, 본문 블록이 차례로 있습니다.

이전 다이어그램에서는 인수 값이 명시된 데이터 유형이면 첫 번째 본문이 실행됩니다.

소수 프로그램에서 입력값이 1~10의 범위를 벗어난 정수인 경우 메시지를 출력할 수 있나요?

is 키워드로 다른 브랜치를 추가합니다.

  1. xAny 유형이 되도록 수정합니다. 이는 xInt 유형 이외의 값이 될 수 있음을 나타내기 위함입니다.
fun main() {
    val x: Any = 4

    when (x) {
        2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
        in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
        else -> println("x isn't a prime number between 1 and 10.")
    }
}
  1. when 문의 두 번째 브랜치 뒤에 is 키워드와 Int 데이터 유형, println("x is an integer number, but not between 1 and 10.") 본문을 차례로 추가합니다.
fun main() {
    val x: Any = 4

    when (x) {
        2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
        in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
        is Int -> println("x is an integer number, but not between 1 and 10.")
        else -> println("x isn't a prime number between 1 and 10.")
    }
}
  1. else 브랜치에서 본문을 println("x isn't an integer number.") 본문으로 변경합니다.
fun main() {
    val x: Any = 4

    when (x) {
        2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
        in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
        is Int -> println("x is an integer number, but not between 1 and 10.")
        else -> println("x isn't an integer number.")
    }
}
  1. x 변수를 20 값으로 변경합니다.
fun main() {
    val x: Any = 20

    when (x) {
        2, 3, 5, 7 -> println("x is a prime number between 1 and 10.")
        in 1..10 -> println("x is a number between 1 and 10, but not a prime number.")
        is Int -> println("x is an integer number, but not between 1 and 10.")
        else -> println("x isn't an integer number.")
    }
}
  1. 프로그램을 실행한 후 출력을 확인합니다.
x is an integer number, but not between 1 and 10.

프로그램은 세 번째 브랜치의 메시지를 출력하지만 첫 번째 또는 두 번째, 네 번째 브랜치의 메시지는 출력하지 않습니다.

다음은 프로그램의 작동 방식입니다.

  • x 변수에 20 값이 할당됩니다.
  • 프로그램은 첫 번째 브랜치의 조건을 평가하기 위해 진행됩니다. 20 값은 2 또는 3, 5, 7 값이 아니므로 프로그램은 첫 번째 브랜치의 본문 실행을 건너뛰고 두 번째 브랜치로 진행됩니다.
  • 20 값이 1~10 범위 내에 없으므로 프로그램이 두 번째 브랜치의 본문 실행을 건너뛰고 세 번째 브랜치로 진행됩니다.
  • 20 값이 Int 유형이므로 x is an integer number, but not between 1 and 10 본문이 출력됩니다.
  • 본문이 한 개 실행되었으므로 프로그램은 when 문을 종료하고 else 브랜치를 무시합니다.

직접 해 보기

이제 신호등 프로그램에서 배운 내용을 연습해 보세요.

일부 국가에는 신호등에 호박색이 있고 이는 다른 국가에 있는 노란색 신호등과 같은 방식으로 운전자에게 경고를 한다고 가정해 보세요. 이러한 추가 조건이 적용되고 원래 조건이 유지되도록 프로그램을 수정할 수 있나요?

같은 본문이 있는 조건 추가

신호등 프로그램에 조건을 추가합니다.

  1. 아직 열려 있다면 신호등 프로그램을 사용하여 Kotlin 플레이그라운드 인스턴스로 돌아갑니다.
  2. 닫았다면 새 Kotlin 플레이그라운드 인스턴스를 열고 다음 코드를 입력합니다.
fun main() {
    val trafficLightColor = "Yellow"

    when (trafficLightColor) {
        "Red" -> println("Stop")
        "Yellow" -> println("Slow")
        "Green" -> println("Go")
        else -> println("Invalid traffic-light color")
    }
}
  1. when 문의 두 번째 브랜치에서 "Yellow" 조건 뒤에 쉼표를 추가하고 "Amber" 조건을 추가합니다.
fun main() {
    val trafficLightColor = "Yellow"

    when (trafficLightColor) {
        "Red" -> println("Stop")
        "Yellow", "Amber" -> println("Slow")
        "Green" -> println("Go")
        else -> println("Invalid traffic-light color")
    }
}
  1. trafficLightColor 변수를 "Amber" 값으로 변경합니다.
fun main() {
    val trafficLightColor = "Amber"

    when (trafficLightColor) {
        "Red" -> println("Stop")
        "Yellow", "Amber" -> println("Slow")
        "Green" -> println("Go")
        else -> println("Invalid traffic-light color")
    }
}
  1. 프로그램을 실행한 후 출력을 확인합니다.
Slow

4. if/else 및 when을 표현식으로 사용

if/elsewhen을 문으로 사용하는 방법을 알아봤습니다. 조건문을 문으로 사용하면 각 브랜치가 조건에 따라 본문에서 다른 작업을 실행할 수 있습니다.

조건문을 표현식으로 사용하여 조건의 각 브랜치에 다른 값을 반환할 수도 있습니다. 각 브랜치의 본문이 비슷하게 표시되면 조건식을 사용하여 조건문에 비해 코드 가독성을 개선할 수 있습니다.

if/else 표현식을 설명하는 다이어그램. val 키워드 다음에 이름 블록이 있고 등호, if 키워드, 괄호가 차례로 이어집니다. 괄호 안에는 조건이 포함되어 있고 그 뒤에는 중괄호, 중괄호 안에는 본문 1 블록이 있습니다. 그 다음에는 else 키워드와 중괄호가 있으며 중괄호 안에 본문 2 블록이 있습니다.

표현식으로의 조건문 문법은 문과 비슷하지만 각 브랜치의 본문 마지막 줄은 값 또는 표현식을 반환해야 하고 조건문은 변수에 할당됩니다.

본문에 반환 값 또는 표현식만 포함되어 있는 경우 중괄호를 삭제하여 코드를 더 간결하게 만들 수 있습니다.

if/else 표현식을 설명하는 다이어그램. val 키워드 다음에 이름 블록이 있고 등호, if 키워드, 괄호가 차례로 이어지며 괄호 안에는 조건이 포함되어 있습니다. 그 뒤에는 표현식 1 블록과 else 키워드, 표현식 2 블록이 차례로 있습니다.

다음 섹션에서는 신호등 프로그램을 통해 if/else 표현식을 살펴봅니다.

if 문을 표현식으로 변환

if/else 문에는 println() 문이 많이 반복됩니다.

fun main() {
    val trafficLightColor = "Black"

    if (trafficLightColor == "Red") {
        println("Stop")
    } else if (trafficLightColor == "Yellow") {
        println("Slow")
    } else if (trafficLightColor == "Green") {
        println("Go")
    } else {
        println("Invalid traffic-light color")
    }

}

if/else 문을 if/else 표현식으로 변환하여 반복을 삭제합니다.

  1. Kotlin 플레이그라운드에서 이전 신호등 프로그램을 입력합니다.
  2. message 변수를 정의한 후 if/else 문을 할당합니다.
fun main() {
    val trafficLightColor = "Black"

    val message = if (trafficLightColor == "Red") {
        println("Stop")
    } else if (trafficLightColor == "Yellow") {
        println("Slow")
    } else if (trafficLightColor == "Green") {
        println("Go")
    } else {
        println("Invalid traffic-light color")
    }

}
  1. println() 문 및 중괄호를 모두 삭제하되 그 안의 값은 그대로 둡니다.
fun main() {
    val trafficLightColor = "Black"

    val message =
      if (trafficLightColor == "Red") "Stop"
      else if (trafficLightColor == "Yellow") "Slow"
      else if (trafficLightColor == "Green") "Go"
      else "Invalid traffic-light color"
}
  1. 프로그램 끝에 println() 문을 추가한 후 message 변수를 인수로 전달합니다.
fun main() {
    val trafficLightColor = "Black"

    val message =
      if (trafficLightColor == "Red") "Stop"
      else if (trafficLightColor == "Yellow") "Slow"
      else if (trafficLightColor == "Green") "Go"
      else "Invalid traffic-light color"

    println(message)
}
  1. 프로그램을 실행한 후 출력을 확인합니다.
Invalid traffic-light color

직접 해 보기

when 문 대신 when 표현식을 사용하도록 신호등 프로그램을 변환합니다.

  1. Kotlin 플레이그라운드에서 다음 코드를 입력합니다.
fun main() {
    val trafficLightColor = "Amber"

    when (trafficLightColor) {
        "Red" -> println("Stop")
        "Yellow", "Amber" -> println("Slow")
        "Green" -> println("Go")
        else -> println("Invalid traffic-light color")
    }
}

println() 문을 반복하지 않도록 when 문을 표현식으로 변환할 수 있나요?

  1. message 변수를 만들어 when 표현식을 할당합니다.
fun main() {
    val trafficLightColor = "Amber"

    val message = when(trafficLightColor) {
        "Red" -> "Stop"
        "Yellow", "Amber" -> "Proceed with caution."
        "Green" -> "Go"
        else -> "Invalid traffic-light color"
    }
}
  1. 프로그램의 마지막 줄로 println() 문을 추가한 후 message 변수를 인수로 전달합니다.
fun main() {
    val trafficLightColor = "Amber"

    val message = when(trafficLightColor) {
        "Red" -> "Stop"
        "Yellow", "Amber" -> "Proceed with caution."
        "Green" -> "Go"
        else -> "Invalid traffic-light color"
    }
    println(message)
}

5. 결론

축하합니다. 조건문과 Kotlin에서 이를 작성하는 방법을 알아봤습니다.

요약

  • Kotlin에서는 if/else 또는 when 조건문을 사용하여 브랜치를 실행할 수 있습니다.
  • if/else 조건문에서 if 브랜치 본문은 if 브랜치 조건 내의 불리언 표현식이 true 값을 반환할 때만 실행됩니다.
  • if/else 조건문의 후속 else if 브랜치는 이전 if 또는 else if 브랜치에서 false 값을 반환할 때만 실행됩니다.
  • if/else 조건문의 마지막 else 브랜치는 이전 모든 if 또는 else if 브랜치에서 false 값을 반환하는 경우에만 실행됩니다.
  • 브랜치가 3개 이상인 경우 if/else 조건문 대신 when 조건문을 사용하는 것이 좋습니다.
  • 쉼표(,), in 범위, is 키워드를 사용하여 when 조건문에서 좀 더 복잡한 조건을 작성할 수 있습니다.
  • if/elsewhen 조건문은 문 또는 표현식으로 사용할 수 있습니다.

자세히 알아보기