Kotlin에서 조건부 동작 추가

1. 시작하기 전에

이 Kotlin Codelab에서는 다른 주사위 게임 Lucky Dice Roll을 만들어 행운의 숫자를 굴려 봅니다. 프로그램에서 행운의 숫자를 설정하고 주사위를 굴립니다. 그런 다음 행운의 숫자와 비교하여 굴리기 값을 확인하고 적절한 메시지를 출력에 인쇄합니다. 이를 위해 값을 비교하고 Kotlin 프로그램에서 다른 결정을 내리는 방법을 알아봅니다.

앱의 사용자 인터페이스에 관해 걱정할 필요 없이 프로그래밍 개념에 집중할 수 있도록 브라우저 기반 Kotlin 프로그래밍 도구를 사용하여 결과를 콘솔에 출력합니다.

기본 요건

학습할 내용

  • ifelse 문 사용 방법
  • 초과(>), 미만(<), 같음(==) 등의 연산자를 사용하여 값을 비교하는 방법
  • when 문을 사용하여 주어진 값에 기반한 옵션을 선택하는 방법
  • Boolean 데이터 유형의 정의 및 의사 결정을 위해 truefalse 값을 사용하는 방법

빌드할 프로그램

  • 행운의 숫자를 지정할 수 있는 Kotlin 기반의 주사위 게임 Lucky Dice Roll 행운의 숫자를 굴리는 플레이어가 승리합니다.

요구사항

  • 인터넷이 연결된 컴퓨터

2 코드 내에서 의사 결정

Lucky Dice Roller 프로그램에서는 사용자가 행운의 숫자를 굴려서 축하 메시지를 받는지 아니면 대신 다시 시도하라는 메시지를 받는지 결정해야 합니다.

앱 개발자는 앱의 동작 방식을 결정하고 사용자를 위해 다양한 결과를 만들어야 합니다.

쇼핑 앱을 빌드하고 있다면 사용자가 선택한 배송 옵션에 따라 다양한 화면을 표시할 수 있습니다. 퀴즈 게임의 경우 플레이어의 답변이 올바른지에 따라 다양한 화면을 표시합니다. 앱에 따라 가능한 결과는 여러 가지일 수 있고 이러한 다양한 결과를 코드에 고려하는 것이 좋습니다.

Lucky Dice Roller 프로그램에서 앱은 다음과 같은 여러 사례를 처리해야 합니다.

  • If 주사위 굴리기로 행운의 숫자가 나오면 축하 메시지를 표시합니다.
  • Else if 주사위 굴리기로 행운의 숫자가 나오지 않으면 다시 시도하라는 메시지를 표시합니다.

이 로직을 코드에 추가하려면 if, else, when과 같은 특수한 Kotlin 키워드를 사용하세요.

몇 가지 예를 살펴보겠습니다.

if 문을 사용하여 충족되는 조건 설정

  1. 아래 코드를 검사합니다. 출력 결과를 추측할 수 있나요?
fun main() {
   val num = 5
   if (num > 4) {
       println("The variable is greater than 4")
   }
}
  1. Kotlin 프로그램 편집기에 코드를 복사하여 붙여넣고 프로그램을 실행하여 결과를 관찰합니다.
The variable is greater than 4

이 프로그램의 의사 결정 프로세스는 다음과 같습니다.

  1. num 변수를 만들어 5.로 설정합니다.
  2. num이 4보다 큰 것이 true이면 "The variable is greater than 4"를 출력합니다.
  3. 다른 모든 상황에서는 아무것도 하지 않습니다.

위 예에서 num은 5로 설정됩니다. if 문은 변수가 4보다 큰지 비교합니다. 4보다 큰 것이 true이므로 시스템은 다음에 중괄호 안의 명령을 실행하여 메시지를 출력합니다.

if 문의 일반적인 형식은 다음과 같습니다.

  • if 키워드로 시작합니다.
  • 그다음에 괄호 () 두 개가 옵니다. 괄호 안에 조건을 입력합니다. 조건은 true 또는 false일 수 있는 모든 항목입니다. 예를 들어 숫자가 다른 숫자보다 큰지 여부를 나타냅니다.
  • 그리고 중괄호 {} 두 개를 작성합니다. 중괄호 안에 조건이 true인 경우 실행할 코드를 입력합니다.
if (condition-is-true) {
    execute-this-code
}

if 문을 사용하여 충족되지 않는 조건 설정

  1. 아래와 같이 num 값을 3으로 변경합니다. 이 코드를 실행하면 어떤 결과가 나올 것 같나요?
fun main() {
    val num = 3
    if (num > 4) {
        println("The variable is greater than 4")
    }
}
  1. Kotlin 프로그램 편집기에 코드를 복사하여 붙여넣고 프로그램을 실행하여 빈 결과를 관찰합니다.

num을 3으로 설정하면 아무것도 출력되지 않습니다. num 값이 4보다 작기 때문입니다. 따라서 num이 4보다 큰 조건이 false이고 중괄호 사이에 있는 코드가 실행되지 않아서 아무것도 출력되지 않습니다.

else를 사용하여 실패한 조건의 대안 만들기

아무 조치도 취하지 않는 대신 조건이 충족되지 않을 때 사용자에게 대안을 제공할 수 있습니다. 일반 언어와 마찬가지로 else 문을 사용하면 됩니다.

  1. 아래와 같이 else 문을 추가하여 num이 4보다 크지 않을 때 메시지를 출력합니다. 이 코드를 실행하면 어떤 결과가 나올 것 같나요?
fun main() {
    val num = 3
    if (num > 4) {
        println("The variable is greater than 4")
    } else {
        println("The variable is less than 4")
    }
}
  1. Kotlin 프로그램 편집기에 코드를 복사하여 붙여넣고 프로그램을 실행하여 결과를 관찰합니다.
The variable is less than 4
  1. num 값이 3인 경우 프로그램은 else 문과 연결된 'The variable is less than 4' 메시지를 출력합니다. num이 4보다 크지 않기 때문입니다.
  2. num을 5로 변경하고 프로그램을 다시 실행합니다. 이제 num이 4보다 큰 것이 true이므로 프로그램에서 'The variable is greater than 4'를 출력합니다.
  3. num을 4로 변경하고 프로그램을 실행합니다. 이제 4가 4보다 크지 않으므로 프로그램에서 'The variable is less than 4'를 출력합니다.

'The variable is less than 4'가 코드에 설정한 조건의 올바른 출력이긴 하나 출력된 문은 정확하지 않습니다. 4가 4보다 작지 않기 때문입니다. 할 수 있는 작업은 세 번째 가능성, 즉 num이 정확히 4인지를 확인하고 이 조건이 true일 때 올바른 문을 출력하는 또 다른 조건을 추가하는 것입니다.

else if 조합을 사용하여 대체 조건 추가

조건은 두 개 이상 지정할 수 있습니다. 예를 들어 다음은 num의 모든 가능성을 커버하는 방법입니다.

  • If. num이 4보다 크면 "The variable is greater than 4"를 출력합니다.
  • Else if. num이 4와 같으면 "The variable is equal to 4"를 출력합니다.
  • Else. "The variable is less than 4"를 출력합니다.

if-else 문에서는 이러한 경우를 다른 사례라고 합니다. 나열된 사례는 3가지입니다.

업데이트된 코드는 다음과 같습니다.

fun main() {
    val num = 4
    if (num > 4) {
        println("The variable is greater than 4")
    } else if (num == 4) {
        println("The variable is equal to 4")
    } else {
        println("The variable is less than 4")
    }
}

다음 사항이 변경되었습니다.

  • 이제 num의 값이 4로 설정되므로 새 조건을 테스트할 수 있습니다.
  • 원래 ifelse 문 사이에 num이 정확히 4인 경우의 새 else if 문이 있습니다.
  1. Kotlin 프로그램 편집기에 위의 코드를 복사하여 붙여넣고 프로그램을 실행하여 결과를 관찰합니다.
The variable is equal to 4
  1. num의 값을 변경하여 출력에 어떤 영향을 미치는지 실험해 봅니다. num을 2와 6으로 변경하여 각 조건이 true로 표시될 수 있도록 합니다.

제어 흐름

위의 if-else 문을 살펴보면 코드가 조건으로 제어되는 대로 실행되거나 흐릅니다. 따라서 이러한 조건문으로 실행을 안내하는 방식을 프로그램의 '제어 흐름'이라고 합니다.

  • 주사위 굴리기 num이 3이라고 가정해 보겠습니다. 프로그램은 첫 번째 조건(num > 4)을 확인합니다. 이는 false이므로 프로그램에서는 다음 조건(num == 4)을 확인하지만 이 조건도 false입니다. 그러면 프로그램은 최종 옵션인 else 문의 코드를 실행합니다.
  • 주사위 굴리기 num이 6이면 첫 번째 조건(num > 4)은 true입니다. 프로그램에서 'The variable is greater than 4' 메시지가 출력됩니다. 이 조건이 true이므로 나머지 조건을 확인하지 않아도 되며 if-else 문으로 완료됩니다.
  • else + if 조합을 사용하여 대체 조건을 추가합니다.

3. Lucky Dice Roll 게임 만들기

이 섹션에서는 이전 작업에서 학습한 내용을 사용하여, 미리 설정된 행운의 숫자가 나왔는지 확인하도록 Dice Roller 프로그램을 업데이트합니다. 행운의 숫자가 나왔다면 승리한 것입니다.

시작 코드 설정

이전 Kotlin Dice Roller 프로그램의 솔루션 코드와 비슷한 코드를 사용하여 Lucky Dice Roller를 시작합니다. 이전 코드의 main() 함수를 일치하도록 수정하거나 아래 코드를 복사하여 붙여넣어 시작할 수 있습니다.

fun main() {
    val myFirstDice = Dice(6)
    val rollResult = myFirstDice.roll()
    println("Your ${myFirstDice.numSides} sided dice rolled ${rollResult}!")
}

class Dice (val numSides: Int) {

    fun roll(): Int {
        return (1..numSides).random()
    }
}

행운의 숫자가 나왔는지 확인

먼저 행운의 숫자를 만들고 주사위 굴리기 값을 행운의 숫자와 비교합니다.

  1. main()에서 println() 문을 삭제합니다.
  2. main()에서 luckyNumber라는 val을 추가하고 4로 설정합니다. 코드는 다음과 같이 표시됩니다.
fun main() {
    val myFirstDice = Dice(6)
    val rollResult = myFirstDice.roll()
    val luckyNumber = 4
}
  1. 아래에서 괄호 () 안에 rollResultluckyNumber와 같은지(==) 확인하는 조건이 있는 if 문을 추가합니다. 중괄호 {} 사이에 공간을 두어 코드를 더 추가할 수 있습니다.
fun main() {
    val myFirstDice = Dice(6)
    val rollResult = myFirstDice.roll()
    val luckyNumber = 4
    if (rollResult == luckyNumber) {

    }
}
  1. 중괄호 {} 안에 println 문을 추가하여 "You win!"을 출력합니다.
fun main() {
    val myFirstDice = Dice(6)
    val rollResult = myFirstDice.roll()
    val luckyNumber = 4

    if (rollResult == luckyNumber) {
        println("You win!")
    }
}
  1. 프로그램을 실행합니다. 행운의 숫자가 나와서 승리 메시지가 표시되려면 여러 번 실행해야 할 수 있습니다.
You win!

행운의 숫자가 나오지 않았을 때 응답

사용자가 승리하지 못한 경우 프로그램에서 피드백을 받지 못하면 사용자는 프로그램이 고장이 난 것인지 생각하게 될 수 있습니다. 사용자가 수행한 작업에 항상 응답을 제공하는 것이 좋습니다. Lucky Dice Roller 프로그램의 경우 else 문을 사용하여 승리하지 못했다고 사용자에게 알릴 수 있습니다.

  1. else 문을 추가하여 "You didn't win, try again!"을 출력합니다.
fun main() {
    val myFirstDice = Dice(6)
    val rollResult = myFirstDice.roll()
    val luckyNumber = 4

    if (rollResult == luckyNumber) {
        println("You win!")
    } else {
        println("You didn't win, try again!")
    }
}
  1. 프로그램을 실행하면 어떤 결과가 나오든지 사용자에게 항상 알림이 전송됩니다.

이 시점에서 사용자는 승패를 알지만 그 이유는 알지 못합니다. 사용자에게 항상 정보를 제공하여 주사위를 굴린 결과를 사용자가 잘 알게 합니다. 프로그램이 대출 애플리케이션이라고 생각해 보세요. '신용 등급이 낮아서 승인되지 않았습니다'는 '죄송합니다. 대출받지 못하셨습니다. 다시 시도하세요'보다 훨씬 구체적인 정보를 제공합니다. Lucky Dice Roller의 경우 사용자가 패배하면 주사위를 굴릴 때마다 다른 정보 메시지를 사용자에게 제공할 수 있습니다. else if 문을 여러 개 사용하여 이 작업을 실행합니다.

  1. else if 문을 추가하여 주사위를 굴릴 때마다 다른 메시지를 출력합니다. 필요에 따라 이전 작업에서 알아본 형식을 참고하세요.
fun main() {
    val myFirstDice = Dice(6)
    val rollResult = myFirstDice.roll()
    val luckyNumber = 4

    if (rollResult == luckyNumber) {
        println("You win!")
    } else if (rollResult == 1) {
        println("So sorry! You rolled a 1. Try again!")
    } else if (rollResult == 2) {
        println("Sadly, you rolled a 2. Try again!")
    } else if (rollResult == 3) {
        println("Unfortunately, you rolled a 3. Try again!")
    } else if (rollResult == 5) {
        println("Don't cry! You rolled a 5. Try again!")
    } else {
        println("Apologies! You rolled a 6. Try again!")
    }
}

위의 코드에서는 다음 작업을 실행합니다.

  • rollResultluckyNumber인지 확인합니다.
  • rollResultluckyNumber이면 승리 메시지를 출력합니다.
  • luckyNumber가 아니면 rollResult가 1인지 확인하고 1이면 다시 시도 메시지를 출력합니다.
  • 1이 아니면 rollResult가 2인지 확인하고 2이면 다른 다시 시도 메시지를 출력합니다.
  • 2가 아니면 숫자 5까지 계속 확인합니다.
  • 숫자가 1~5 중 어느 것도 아니면 남아 있는 유일한 옵션은 6이므로 else if를 사용하여 또 다른 테스트를 할 필요가 없습니다. 최종 else 문으로 마지막 옵션을 사용하기만 하면 됩니다.

else if 사례가 여러 개 있는 경우가 매우 흔하므로 Kotlin에는 else if 문을 작성하는 간단한 방법이 있습니다.

4. when 문 사용

다양한 결과 또는 사례 테스트는 프로그래밍에서 매우 일반적입니다. 가능한 결과의 목록이 매우 길 수도 있습니다. 예를 들어 12면 주사위를 굴린다면 성공과 최종 else 사이에 else if 문이 11개가 있습니다. 이러한 종류의 문을 읽고 쓰기 쉽게 만들어 오류를 방지할 수 있도록 Kotlin에서는 when 문을 사용할 수 있습니다.

when 문을 사용하도록 프로그램을 변경합니다. when 문은 키워드 when으로 시작하고 뒤이어 괄호 ()가 나옵니다. 괄호 안에 테스트할 값을 입력합니다. 그다음에 다른 조건의 코드를 실행하기 위한 중괄호 {}가 이어집니다.

  1. 프로그램의 main()에서 첫 번째 if 문에서 마지막 else 문을 닫는 중괄호 }까지의 코드를 선택하여 삭제합니다.
fun main() {
    val myFirstDice = Dice(6)
    val rollResult = myFirstDice.roll()
    val luckyNumber = 4
}
  1. main()luckyNumber 선언 아래에서 when 문을 만듭니다. when은 굴려진 결과와 비교하여 테스트해야 하므로 괄호 () 사이에 rollResult를 입력합니다. 추가 공백을 포함하여 아래와 같이 중괄호 {}를 추가합니다.
fun main() {
    val myFirstDice = Dice(6)
    val rollResult = myFirstDice.roll()
    val luckyNumber = 4

    when (rollResult) {

    }
}

앞에서와 같이 먼저 rollResultluckyNumber와 동일한지 테스트합니다.

  1. when 문의 중괄호 {} 안에 luckyNumber와 비교하여 rollResult를 테스트하는 문을 추가하고 두 값이 같으면 승리 메시지를 출력합니다. 문은 다음과 같습니다.
luckyNumber -> println("You win!")

이는 다음을 의미합니다.

  • 먼저 rollResult와 비교하려는 값을 입력합니다. 그 값이 luckyNumber입니다.
  • 그 뒤에 화살표(->)를 입력합니다.
  • 그런 다음 일치하면 실행할 작업을 추가합니다.

다음과 같이 해석할 수 있습니다. 'rollResultluckyNumber이면 "You win!" 메시지를 출력합니다.'

main() 코드는 다음과 같습니다.

fun main() {
    val myFirstDice = Dice(6)
    val rollResult = myFirstDice.roll()
    val luckyNumber = 4

    when (rollResult) {
        luckyNumber -> println("You win!")
    }
}
  1. 같은 패턴을 사용하여 아래와 같이 가능한 굴리기 결괏값인 1~6(4 제외)을 위한 줄과 메시지를 추가합니다. 완성된 main() 함수는 다음과 같습니다.
fun main() {
    val myFirstDice = Dice(6)
    val rollResult = myFirstDice.roll()
    val luckyNumber = 4

    when (rollResult) {
        luckyNumber -> println("You won!")
        1 -> println("So sorry! You rolled a 1. Try again!")
        2 -> println("Sadly, you rolled a 2. Try again!")
        3 -> println("Unfortunately, you rolled a 3. Try again!")
        5 -> println("Don't cry! You rolled a 5. Try again!")
        6 -> println("Apologies! You rolled a 6. Try again!")
    }
}
  1. 프로그램을 실행합니다. 출력에는 차이가 없지만 코드가 훨씬 더 간결하고 읽기 쉽습니다.

축하합니다. 조건에 따라 메시지를 출력하는 두 가지 방법을 알아봤습니다. 흥미로운 프로그램을 작성하는 강력한 도구입니다.

5 솔루션 코드

fun main() {
    val myFirstDice = Dice(6)
    val rollResult = myFirstDice.roll()
    val luckyNumber = 4

    when (rollResult) {
        luckyNumber -> println("You won!")
        1 -> println("So sorry! You rolled a 1. Try again!")
        2 -> println("Sadly, you rolled a 2. Try again!")
        3 -> println("Unfortunately, you rolled a 3. Try again!")
        5 -> println("Don't cry! You rolled a 5. Try again!")
        6 -> println("Apologies! You rolled a 6. Try again!")
   }
}

class Dice(val numSides: Int) {
    fun roll(): Int {
        return (1..numSides).random()
    }
}

6. 요약

  • if 문을 사용하여 일부 명령을 실행하는 조건을 설정합니다. 예를 들어 사용자가 행운의 숫자를 굴리면 승리 메시지를 출력합니다.
  • Boolean 데이터 유형에는 truefalse라는 값이 있고 의사 결정에 사용할 수 있습니다.
  • 초과(>), 미만(<), 같음(==) 등의 연산자를 사용하여 값을 비교합니다.
  • else if 문 체인을 사용하여 여러 조건을 설정합니다. 예를 들어 가능한 각 주사위 굴리기에 다른 메시지를 출력합니다.
  • 조건 체인 끝에 else 문을 사용하여 명시적으로 커버되지 않을 수 있는 사례를 포착합니다. 6면 주사위 사례를 커버하면 else 문이 8면 주사위로 굴린 값인 숫자 7과 8을 포착합니다.
  • 값 비교에 따라 코드를 실행하는 간단한 형식으로 when 문을 사용합니다.

if-else의 일반 형식

if (condition-is-true) {
    execute-this-code
} else if (condition-is-true) {
    execute-this-code
} else {
    execute-this-code
}

when 문

when (variable) {
    matches-value -> execute-this-code
    matches-value -> execute-this-code
    ...
}

7 자세히 알아보기

8 연습하기

다음을 따르세요.

  1. 8면이 되도록 myFirstDice를 변경하고 코드를 실행합니다. 어떤 결과가 나타나나요?

힌트: 면 수를 늘리면 when 문이 더 이상 모든 사례를 커버하지 않으므로 커버되지 않은 사례의 경우 아무것도 출력되지 않습니다.

  1. 8면을 모두 고려하도록 when 문을 수정합니다. 추가 숫자의 사례를 추가하면 됩니다. 도전과제: 각 숫자의 새 사례를 추가하는 대신 else 문을 사용하여 명시적으로 커버되지 않은 모든 사례를 포착합니다.

힌트: 더 많은 사례를 추가하여 면을 더 많이 커버할 수 있습니다. 굴릴 수 있는 각 숫자에 다른 메시지가 표시되길 바란다면 이 방법이 좋습니다. 또는 else 문을 사용하고 현재 코드에서 커버되는 6보다 큰 모든 면에 동일한 메시지를 출력할 수 있습니다.

  1. 면이 4개만 있도록 myFirstDice를 변경합니다. 어떤 결과가 나타나나요?

힌트: 주사위의 면 수를 when 문에서 커버하는 값보다 적게 변경하면 별다른 영향이 없습니다. 발생할 수 있는 모든 사례를 커버하기 때문입니다.