Kotlin에서 생일 메시지 만들기

1. 소개

이 Codelab에서는 케이크와 생일 배너가 포함된 생일 메시지를 출력하는 간단한 Kotlin 프로그램을 만들어 봅니다.

기본 요건

학습할 내용

  • 프로그램에서 좀 더 복잡한 텍스트를 출력하는 방법
  • Kotlin으로 기초적인 수학 계산을 하고 나중에 사용하기 위해 결과를 변수로 저장하는 방법
  • 같은 문자열을 여러 번 출력하는 함수를 만드는 방법
  • 텍스트 스니펫을 여러 번 출력하는 루프를 만드는 방법

빌드할 프로그램

  • 생일 메시지와 텍스트 기반 케이크 사진, 배너를 출력하는 데 사용할 수 있는 간단한 프로그램을 만듭니다.

필요한 항목

  • 인터넷 액세스가 가능하고 최신 버전의 Chrome과 같은 최신 웹브라우저가 설치된 컴퓨터

2. Kotlin에서 생일 메시지 만들기

시작 코드 설정

  1. 브라우저에서 https://developer.android.com/training/kotlinplayground를 엽니다. 그러면 브라우저 기반 Kotlin 프로그래밍 도구가 열립니다.
  2. fun main() 함수 내에서 "Hello, world!" 텍스트를 "Happy Birthday, Rover!"로 바꿉니다.
  3. 그 아래, 중괄호 안에 출력할 두 줄("You are already 5!", "5 is the very best age to celebrate!".)을 추가합니다.

완성된 코드는 다음과 같이 표시됩니다.

fun main() {
    println("Happy Birthday, Rover!")
    println("You are already 5!")
    println("5 is the very best age to celebrate!")
}
  1. 코드를 실행합니다.
  2. 출력 창에 Happy Birthday, Rover!와 그 아래에 You are already 5!5 is the very best age to celebrate!가 표시되는지 확인합니다.
Happy Birthday, Rover!
You are already 5!
5 is the very best age to celebrate!

생일 케이크 추가

생일 메시지에는 생일 테마 사진이 필요합니다. 케이크 사진처럼요. 키보드의 문자 및 기호와 println()을 사용하는 추가 줄을 출력하여 생일 메시지에 케이크를 추가할 수 있습니다.

위의 솔루션 코드에서 계속 진행합니다.

  1. 다음과 같이 코드에서 Happy BirthdayYou are already 5의 두 println() 문 사이에 다음 줄과 같은 print 문을 추가합니다. 이렇게 하면 케이크가 만들어집니다. 마지막 println() 문에는 따옴표 사이에 텍스트가 없어 빈 줄을 출력합니다.
    println("   ,,,,,   ")
    println("   |||||   ")
    println(" =========")
    println("@@@@@@@@@@@")
    println("{~@~@~@~@~}")
    println("@@@@@@@@@@@")
    println("")

다른 사람이 코드를 이해할 수 있도록 케이크를 출력하기 전에 주석을 추가할 수 있습니다. 코드를 실행해도 출력이 달라지지는 않습니다. 주석은 시스템 명령어가 아니라 개발자 참고용이기 때문입니다. 인라인 주석은 다음과 같이 //로 시작한 다음 텍스트가 뒤따릅니다.

// This is a comment line
// This is another comment
  1. 케이크를 출력하기 전에 주석을 추가합니다. // Let's print a cake!
  2. 빈 줄을 출력하기 전에 주석을 추가합니다. // This prints an empty line

코드는 다음 코드와 같이 표시됩니다.

fun main() {
    println("Happy Birthday, Rover!")

    // Let's print a cake!
    println("   ,,,,,   ")
    println("   |||||   ")
    println(" =========")
    println("@@@@@@@@@@@")
    println("{~@~@~@~@~}")
    println("@@@@@@@@@@@")

    // This prints an empty line.
    println("")

    println("You are already 5!")
    println("5 is the very best age to celebrate!")
}
  1. 코드를 실행하면 다음과 같이 출력됩니다.
Happy Birthday, Rover!
   ,,,,,
   |||||
 =========
@@@@@@@@@@@
{~@~@~@~@~}
@@@@@@@@@@@

You are already 5!
5 is the very best age to celebrate!

3. 변수 만들기 및 사용

로버의 연령을 변수로 저장

  1. 지금까지 완성된 코드에서 동일한 숫자(연령)를 두 번 반복하고 있음을 주목하세요.

이 숫자를 반복하는 대신 한 곳에 변수로 저장할 수 있습니다. 숫자를 상자에 넣고 이름을 지정하는 것과 같습니다. 그러면 값이 필요할 때마다 이 변수 이름을 사용하면 됩니다. 연령이 바뀌면 한 곳에서 프로그램을 변경하기만 하면 됩니다. 변수를 변경하면 변수가 사용되는 모든 위치에 올바른 연령 값이 출력됩니다.

  1. 프로그램에서 main() 함수 내 첫 번째 코드 줄로 다음 코드를 추가하여 다음과 같이 값이 5인 age 변수를 만듭니다. println() 문 앞에 이 줄을 넣어야 합니다.
val age = 5

이 줄의 의미는 다음과 같습니다.

  • val은 Kotlin에서 사용하는 특수 단어로, 키워드라고 하며 뒤에 오는 것이 변수 이름임을 나타냅니다.
  • age는 변수 이름입니다.
  • =는 왼쪽의 age 값을 오른쪽의 값과 동일하게 만듭니다. 수학에서 단일 등호는 양쪽의 값이 동일함을 나타내기 위해 사용됩니다. 수학과 달리 Kotlin에서는 단일 등호가 왼쪽의 이름이 지정된 변수에 오른쪽의 값을 할당하는 데 사용됩니다.

개발자 관점에서 이 줄은 할당된 값이 5age 변수를 선언하는 것입니다.

print 문 내에서 변수를 사용하려면 시스템에 다음에 오는 것이 텍스트가 아니라 변수임을 알려주는 기호로 변수를 둘러싸야 합니다. 텍스트를 출력하는 대신 시스템은 변수 값을 출력해야 합니다. 이 작업은 다음 예와 같이 앞에 달러 기호를 두고 중괄호 안에 변수를 넣어 실행합니다.

${variable}
  1. 코드의 print 문 두 개 모두에서 숫자 5를 다음과 같이 age 변수로 바꿉니다.
println("You are already ${age}!")
println("${age} is the very best age to celebrate!")
  1. 코드를 실행하면 두 메시지에 모두 동일한 연령이 표시됩니다.
  2. 변수 값을 다른 값으로 변경합니다. 예를 들어 연 대신 일 단위로 Rover의 연령을 표시할 수 있습니다. 이렇게 하려면 나이에 365를 곱하고 윤년은 생략합니다. 다음과 같이 변수를 만들 때 바로 계산할 수 있습니다.
val age = 5 * 365
  1. 다시 코드를 실행하면 이제 두 메시지에서 모두 연령을 일수로 표시합니다.
Happy Birthday, Rover!
   ,,,,,
   |||||
 =========
@@@@@@@@@@@
{~@~@~@~@~}
@@@@@@@@@@@

You are already 1825!
1825 is the very best age to celebrate!
  1. [선택사항] 출력 메시지의 텍스트를 변경하여 일수와 더 잘 조화되도록 합니다. 예를 들어 다음과 같이 변경할 수 있습니다.
You are already 1825 days old!
1825 days old is the very best age to celebrate!

변수에 텍스트 넣기

변수에 숫자뿐 아니라 텍스트도 넣을 수 있습니다.

  1. age 변수 아래에서 생일을 맞은 사람의 이름에 사용할 name 변수를 추가하고 "Rover"로 값을 설정합니다.
val name = "Rover"
  1. 생일 메시지의 이름 Rover를 다음과 같이 변수로 바꿉니다.
println("Happy Birthday, ${name}!")

그러면 print 문에 변수가 두 개 이상 포함될 수 있습니다.

  1. 다음과 같이 name 변수를 사용하여 Rover를 연령 메시지에 추가합니다.
println("You are already ${age} days old, ${name}!")

완성된 코드는 다음과 같이 표시됩니다.

fun main() {

    val age = 5 * 365
    val name = "Rover"

    println("Happy Birthday, ${name}!")

    // Let's print a cake!
    println("   ,,,,,   ")
    println("   |||||   ")
    println(" =========")
    println("@@@@@@@@@@@")
    println("{~@~@~@~@~}")
    println("@@@@@@@@@@@")

    // This prints an empty line.
    println("")

    println("You are already ${age} days old, ${name}!")
    println("${age} days old is the very best age to celebrate!")
}

축하합니다. 이제 텍스트, 기호로 만든 그래픽으로 메시지를 만들고 변수를 사용하여 숫자와 텍스트를 저장하며 변수를 사용하여 텍스트를 출력할 수 있습니다.

4. 테두리가 있는 생일 배너 출력

이 작업에서는 생일 배너를 만들고 코드 반복 및 재사용 기법을 사용하여 코드를 간소화하는 방법과 간소화된 코드가 좋은 이유를 알아봅니다.

기본 생일 배너 만들기

  1. https://developer.android.com/training/kotlinplayground에서 코드 내부에 커서를 놓습니다.
  2. 메뉴를 마우스 오른쪽 버튼으로 클릭하여 열고 모두 선택을 선택합니다.
  3. 백스페이스나 삭제 키를 눌러 코드를 모두 삭제합니다.
  4. 다음 코드를 복사하여 편집기에 붙여넣습니다.
fun main() {
    println("=======================")
    println("Happy Birthday, Jhansi!")
    println("=======================")
}
  1. 프로그램을 실행하여 콘솔에 출력된 배너를 확인합니다.
=======================
Happy Birthday, Jhansi!
=======================

테두리 출력을 위한 함수 만들기

방금 붙여넣고 실행한 코드는 print 문 3개가 포함되어 있는 main() 함수입니다. 실행 버튼을 누르면 시스템에서는 함수와 함수 내 모든 코드를 실행합니다.

Kotlin 프로그램에는 항상 main() 함수가 있어야 합니다. 자체 함수를 만들고 사용할 수도 있습니다. 변수가 작업 중복을 방지하는 데 유용한 것처럼 함수를 사용하면 같은 코드를 여러 번 작성하지 않아도 됩니다. 코드에서 배너의 상단과 하단의 print 문이 정확히 동일합니다. 이러한 테두리를 출력하는 함수를 만들고 사용해 보겠습니다.

  1. 편집기에서 main() 함수 아래에 빈 줄을 삽입하여 작업할 공간을 마련합니다. 시스템은 빈 줄을 무시하므로 코드를 구성하는 데 유용한 곳이면 어디에나 삽입할 수 있습니다.
  2. 함수를 만듭니다. 다음과 같이 먼저 fun 키워드로 시작하고 이름 printBorder, 괄호 (), 중괄호 {}로 이어집니다.
fun printBorder() {}

함수 이름 지정에 관한 단어입니다.

  • 함수 이름 printBorder가 소문자와 동사로 시작하는 방식에 주의합니다. 함수 이름은 소문자와 동사로 시작하는 경우가 거의 대부분이며 이름은 함수가 하는 작업을 설명해야 합니다. 예: print() 또는 printBorder()
  • 함수 이름의 두 번째 단어는 대문자로 시작합니다. 이러한 스타일을 '카멜 표기법'이라고 하며 이를 통해 이름을 훨씬 쉽게 읽을 수 있습니다. 추가 이름 예로는 drawReallyCoolFancyBorderprintBirthdayMessage가 있습니다.
  1. printBorder 함수의 닫는 중괄호 }를 새 줄에 입력하고 두 중괄호 사이에 빈 줄을 추가하여 코드를 추가할 공간을 마련합니다. 자체 줄에 닫는 중괄호 }가 있으면 함수가 끝나는 위치를 더 쉽게 확인할 수 있습니다.
  2. main() 함수 내에서 테두리의 print 문을 복사하여 printBorder() 함수의 중괄호 사이에 붙여넣습니다.

완성된 printBorder() 함수는 다음과 같습니다.

fun printBorder() {
    println("=======================")
}

함수를 사용하거나 호출하려면 괄호와 함께 함수의 이름을 사용합니다. 지금까지 println()을 사용한 방식과 같습니다. 따라서 printBorder 함수를 사용하려면 코드에서 필요한 곳 어디에나 printBorder()를 호출하세요.

  1. main() 함수에서 println()을 사용하여 테두리 선을 출력하는 코드 줄을 printBorder() 함수 호출로 바꿉니다. 완성된 코드는 다음과 같이 표시됩니다.
fun main() {
    printBorder()
    println("Happy Birthday, Jhansi!")
    printBorder()
}

fun printBorder() {
    println("=======================")
}
  1. 코드를 실행하여 모든 것이 이전과 동일하게 작동하는지 확인합니다.

출력을 변경하지 않고 더 효율적으로 또는 더 쉽게 작업할 수 있도록 코드를 변경하는 것을 '리팩터링'이라고 합니다.

테두리 패턴 반복

테두리 선을 보면 완전히 똑같은 기호입니다. 다음과 같이 말하지 말고

'기호 23개로 구성된 이 문자열 출력'

다음과 같이 말하세요.

'이 기호 한 개를 23번 출력'

코드에서는 repeat() 문을 사용하여 이 작업을 할 수 있습니다.

  1. printBorder() 함수에서 repeat() 문을 사용하여 등호를 23번 출력합니다.
  2. println()을 사용하는 대신 print()를 사용하여 각 '='를 출력한 후 새 줄로 이동하지 않도록 합니다.

코드는 다음과 같습니다. 이제 등호를 출력하는 단일 명령어가 생겼으니 이 명령어를 23번 반복하려면 repeat() 문을 사용하세요.

fun printBorder() {
    repeat(23) {
        print("=")
    }
}
  • repeat() 문은 repeat 단어로 시작하고 뒤이어 ()가 옵니다. 이러한 종류의 문을 '루프'라고 합니다. 동일한 코드를 여러 번 반복하거나 루프 처리하기 때문입니다. 후반부에 루프를 만드는 다른 방법을 알아봅니다.
  • 괄호 () 안에는 반복 횟수가 있습니다.
  • 뒤이어 중괄호 {}가 나옵니다.
  • 그리고 중괄호 {} 안에는 반복할 코드가 표시됩니다.
  1. printBorder() 함수 내에서 테두리 선 출력을 완료한 후인 repeat() 문의 닫는 중괄호 } 뒤에 println() 문을 추가하여 줄바꿈을 출력합니다.

이제 코드가 다음과 같이 표시됩니다.

fun printBorder() {
    repeat(23) {
        print("=")
    }
    println()
}

main() 함수의 코드는 변경되지 않으며 전체 프로그램은 다음과 같이 표시됩니다.

fun main() {
    printBorder()
    println("Happy Birthday, Jhansi!")
    printBorder()
}

fun printBorder() {
    repeat(23) {
        print("=")
    }
    println()
}
  1. 코드를 실행합니다. 출력은 이전과 같지만 이번에는 '=' 기호를 한 번만 지정하여 테두리를 만들 수 있었습니다.
=======================
Happy Birthday, Jhansi!
=======================

인수를 사용하여 테두리 변경

다른 기호(예: 아래 기호)를 사용하는 테두리를 만들고 싶다면 어떻게 해야 하나요?

%%%%%%%%%%%%%%%%%%%%%%%

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

다양한 각 기호에 별도의 함수를 정의할 수 있습니다. 그러나 더 효율적인 방법으로 이 작업을 할 수 있습니다. 이미 작성한 함수를 재사용하여 더 유연하게 만들면 다양한 종류의 기호에 적용할 수 있습니다.

함수의 장점은 인수를 사용하여 개발자가 입력 값을 지정할 수 있다는 점입니다. 이전 Codelab에서 main()을 다룰 때 간략하게 알아봤습니다. 이 단계에서는 printBorder() 함수에 인수를 추가하여 개발자가 제공하는 테두리 패턴을 출력할 수 있도록 합니다.

  1. main()의 상단에서 테두리 패턴에 사용할 border 변수를 만듭니다. 이렇게 하면 테두리용으로 반복할 텍스트를 유지합니다.
val border = "%"
  1. 이제 border 변수를 두 printBorder() 함수 호출에 모두 인수로 전달합니다. 괄호 () 안에 border를 배치하면 됩니다. println()에 출력할 텍스트를 제공했을 때와 같습니다.

main() 함수는 다음 코드와 같이 표시됩니다.

fun main() {
    val border = "%"
    printBorder(border)
    println("Happy Birthday, Jhansi!")
    printBorder(border)
}

printBorder() 함수는 이 border의 값을 입력으로 사용하여 전체 테두리를 출력하는 방법을 파악합니다.

  1. 코드를 실행합니다. 코드가 실행되지 않고 대신 코드 옆에 오류 아이콘이 표시됩니다. dd0286b7414cea42.png
  2. 출력 패널을 보면 오류 메시지가 있습니다.

이전과 마찬가지로 메시지는 오류가 발생한 위치를 표시하며 오류에 관한 힌트를 제공합니다. 중요한 부분은 Too many arguments for public fun printBorder()입니다. printBorder() 함수를 호출하고 테두리를 입력으로 전달합니다. 그러나 printBorder() 함수 정의는 현재 어떤 입력도 허용하지 않습니다.

  1. 테두리의 인수를 printBorder() 함수 정의에 추가하여 이 오류를 해결합니다. 다음 코드의 첫 줄을 참고하세요.
fun printBorder(border: String) {
    repeat(23) {
        print("=")
    }
    println()
}
  • 인수의 이름은 border입니다.
  • 이름 뒤에는 콜론 :이 옵니다.
  • 그 다음에 인수의 종류나 유형을 설명하는 단어 String이 이어집니다.

String은 따옴표로 묶인 문자로 구성된 텍스트 조각입니다. 목걸이를 만들려고 구슬을 줄에 나란히 꿰는 것처럼 단어나 텍스트를 만들려고 문자를 나란히 배열하는 것입니다. 인수가 String이여야 한다고 지정하면 시스템에서 인수가 숫자 등이 아니라 텍스트라는 것을 적용할 수 있습니다.

  1. 코드를 실행합니다. 이제 printBorder() 함수에서 테두리 String을 입력으로 허용합니다. 또한 main()의 코드가 border를 인수로 사용하여 printBorder(border)를 호출합니다. 코드가 오류 없이 실행됩니다.
  2. 콘솔에서 프로그램의 출력을 보면 이전과 동일한 테두리가 표시되나요?
=======================
Happy Birthday, Jhansi!
=======================

이는 의도된 동작이 아닙니다. '%' 기호로 테두리를 만들려고 했지만 프로그램에서 여전히 '=' 기호로 테두리를 출력하고 있습니다. 다음 단계에서는 이렇게 되는 이유를 살펴봅니다.

  1. 편집기에 회색 느낌표가 표시됩니다. 이 아이콘은 경고를 나타냅니다. 경고는 주의해야 하는 코드 문제를 알리며 경고에 따라 코드 실행을 중지하는 것은 아닙니다. 7579663a694ef6bd.png
  2. 느낌표 위로 마우스를 가져가면 메시지가 표시됩니다. 다음과 같이 표시됩니다. "Parameter 'border' is never used." 이 경고는 출력 문제를 설명합니다. 테두리의 새 문자열을 함수에 전달하지만 출력에 사용하지 않습니다.
  3. '='를 출력하는 대신 전달된 border를 사용하도록 printBorder() 함수를 변경합니다. 이렇게 하면 border가 함수 내에서 정의한 변수인 것과 정확히 동일하게 작동합니다.
fun printBorder(border: String) {
    repeat(23) {
        print(border)
    }
    println()
}
  1. 코드를 다시 실행합니다. 출력이 다음과 같이 표시됩니다.
%%%%%%%%%%%%%%%%%%%%%%%
Happy Birthday, Jhansi!
%%%%%%%%%%%%%%%%%%%%%%%

잘하셨습니다. 문제를 해결했습니다. 완성된 코드는 다음과 같습니다.

fun main() {
    val border = "%"
    printBorder(border)
    println("Happy Birthday, Jhansi!")
    printBorder(border)
}

fun printBorder(border: String) {
    repeat(23) {
        print(border)
    }
    println()
}

코드를 많이 추가하지 않고도 printBorder() 함수를 훨씬 더 유연하게 만들었습니다. 이제 약간의 변경만으로 다양한 기호의 테두리를 출력할 수 있습니다.

  1. [선택사항] main() 함수에서 코드를 한 줄만 변경하여 다음과 같은 생일 배너를 출력하려면 어떻게 해야 하나요?
***********************
Happy Birthday, Jhansi!
***********************
:::::::::::::::::::::::
Happy Birthday, Jhansi!
:::::::::::::::::::::::

인수를 두 개 포함하도록 함수 수정

1자보다 긴 다른 패턴을 사용하려면 다음과 같이 표시합니다. "'-._,-'" 이 패턴은 23번 반복하지 않습니다. 너무 길어지기 때문입니다. 4번 정도는 반복할 수 있습니다. 이렇게 하려면 printBorder()repeat() 문에서 반복 횟수를 변경합니다. 그러나 더 효과적인 방법이 있습니다.

다음 두 가지 사항에 근거하여 더 화려한 테두리를 정의할 수 있습니다.

  • 반복할 패턴(이미 완료한 작업)
  • 패턴을 반복하려는 횟수

패턴과 반복 횟수 각각의 변수를 만들고 두 가지 정보를 모두 printBorder() 함수에 전달할 수 있습니다.

  1. main()에서 테두리를 "'-._,-'" 패턴이 되도록 테두리를 변경합니다.
val border = "`-._,-'"
  1. 코드를 실행하면 이제 패턴이 너무 길어진 것을 알 수 있습니다.
  2. main()border 정의 아래에서 반복 횟수에 사용할 새로운 timesToRepeat 변수를 만듭니다. 값을 4로 설정합니다.
val timesToRepeat = 4
  1. main()에서 printBorder()를 호출할 때 반복 횟수를 두 번째 인수로 추가합니다. 두 인수를 쉼표로 구분합니다.
printBorder(border, timesToRepeat)

이제 main() 함수가 다음과 같이 표시됩니다.

fun main() {
    val border = "`-._,-'"
    val timesToRepeat = 4
    printBorder(border, timesToRepeat)
    println("Happy Birthday, Jhansi!")
    printBorder(border, timesToRepeat)
}

이전과 마찬가지로 이 코드에서는 오류가 발생합니다. printBorder()의 정의보다 printBorder()를 호출하는 인수가 더 많기 때문입니다.

  1. printBorder()를 반복 횟수도 입력으로 허용하도록 수정합니다. 인수 다음에 쉼표를 추가하고 그 뒤에 추가 인수 timesToRepeat: Int.를 배치합니다. 함수 정의의 첫 번째 줄이 다음과 같이 표시됩니다.
fun printBorder(border: String, timesToRepeat: Int) {

알림:

  • 쉼표는 두 인수를 구분합니다.
  • timesToRepeat는 인수의 이름입니다.
  • 그 다음에 콜론 : 기호가 옵니다.
  • 유형: Int. timesToRepeat는 숫자이므로 String 유형이 아니라 정수의 약자인 Int 유형으로 만들어야 합니다.
  1. printBorder() 내에서 숫자 23 대신 timesToRepeat 인수를 사용하도록 repeat를 변경합니다. printBorder() 코드가 다음과 같이 표시됩니다.
fun printBorder(border: String, timesToRepeat: Int) {
    repeat(timesToRepeat) {
        print(border)
    }
    println()
}
  1. 코드를 실행합니다. 그러면 출력이 다음과 같이 표시됩니다.
`-._,-'`-._,-'`-._,-'`-._,-'
Happy Birthday, Jhansi!
`-._,-'`-._,-'`-._,-'`-._,-'
  1. 이 출력을 완벽하게 하려면 생일 축하 메시지 시작 부분에 공백을 두 개 삽입합니다. 그러면 출력이 다음과 같이 표시됩니다.
`-._,-'`-._,-'`-._,-'`-._,-'
  Happy Birthday, Jhansi!
`-._,-'`-._,-'`-._,-'`-._,-'

다음은 배너의 최종 코드입니다.

fun main() {
    val border = "`-._,-'"
    val timesToRepeat = 4
    printBorder(border, timesToRepeat)
    println("  Happy Birthday, Jhansi!")
    printBorder(border, timesToRepeat)
}

fun printBorder(border: String, timesToRepeat: Int) {
    repeat(timesToRepeat) {
        print(border)
    }
    println()
}

축하합니다. 함수와 인수, 변수, 반복 루프를 통해 거의 모든 프로그램에서 사용하는 기본적인 구성요소를 알아봤습니다.

잠시 쉬었다가 아래의 다음 작업을 통해 함수와 루프를 더 많이 만들어 보세요. 그러면 단 몇 줄의 프로그래밍으로 적절한 수의 초가 꽂힌 거대한 케이크를 만들 수 있습니다.

5. 층과 초를 사용하여 케이크 만들기

이 작업에서는 어떤 연령에도 항상 적절한 수의 초가 꽂힌 적절한 크기의 케이크가 되도록 생일 케이크 코드를 업그레이드합니다.

  • 초가 포함된 층층이 쌓인 케이크를 그리는 함수 총 3개를 만듭니다.
  • 다른 repeat() 안에서 repeat()를 사용하여 '중첩 루프'를 만듭니다.
  • 이 코드를 만드는 방법은 프로그램을 만드는 방법과 같습니다. 큰 그림부터 시작하여 세부정보를 추가하는 것입니다. 이를 '하향식 개발'이라고 합니다.
  • 이 연습에서는 자세히 안내되어 있지 않지만 문제가 발생하면 완성된 코드를 참고할 수 있습니다.

다음은 만들어 낼 수 있는 케이크 모양입니다.

 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@

다음 안내를 따르면 됩니다.

main() 함수 만들기

  1. 편집기에서 코드를 Hello, world! 프로그램으로 재설정합니다.
  2. main()의 인수를 삭제할 수 있습니다. 사용하지 않기 때문입니다.
  3. main()에서 변수 age를 만들고 24로 설정합니다.
  4. main()에서 두 번째 변수 layers를 만들고 5로 설정합니다.
  5. main()에서 함수 printCakeCandles()를 호출하여 age를 전달합니다. 이렇게 하면 오류가 발생하는데 아직 이 함수를 만들지 않았기 때문입니다.
  6. 마찬가지로 함수 printCakeTop()을 호출하여 age를 전달합니다.
  7. 마지막으로 함수 printCakeBottom()을 호출하여 agelayers의 수도 전달합니다.
  8. 오류를 방지하려면 다음과 같이 각 줄의 시작 부분에 //를 추가하여 함수 호출 3개를 주석 처리합니다. 이 기법을 사용하면 오류를 트리거하지 않고 코드의 초안을 작성할 수 있습니다.
  9. 프로그램을 실행하면 오류가 발생하지 않고 아무 일도 일어나지 않습니다.

main() 함수는 다음 코드와 같이 표시됩니다.

fun main() {
    val age = 24
    val layers = 5
    // printCakeCandles(age)
    // printCakeTop(age)
    // printCakeBottom(age, layers)
}

printCakeTop() 만들기

케이크 상단 등호 한 줄을 출력할 printCakeTop() 함수는 이 Codelab 초반에 만든 printBorder() 함수와 거의 동일합니다.

==========================
  1. main() 함수 아래에 빈 줄을 추가하고 Int 유형의 한 인수인 age를 사용하는 printCakeTop() 함수를 만듭니다.
  2. 함수 안에서 repeat() 문을 사용하여 등호 하나를 age 횟수에 2를 더하여 출력합니다. 추가된 등호 두 개는 초가 케이크 양쪽으로 떨어지지 않도록 하기 위한 것입니다.
  3. 마지막에 repeat()가 완료되면 빈 줄을 출력합니다.
  4. main()에서 // 기호 두 개를 이제 함수가 있으므로 printCakeTop() 코드 줄 시작 부분에서 삭제합니다.
printCakeTop(age)

완성된 함수는 다음과 같습니다.

fun printCakeTop(age: Int) {
    repeat(age + 2) {
        print("=")
    }
    println()
}
  1. 코드를 실행하여 케이크 상단을 확인합니다.

printCakeCandles() 만들기

각 초는 불꽃을 표현할 쉼표(,)와 초를 표현할 수직선(|)이라는 두 가지 기호로 구성됩니다.

,,,,,,,,,,,,,,,,,,,,,,,,

||||||||||||||||||||||||

함수 하나로 이 작업을 실행하려면 repeat() 문 두 개를 함수에 넣습니다. 하나는 불꽃, 하나는 초에 사용합니다.

  1. main() 함수와 printCakeTop() 함수 아래에서 Int 유형의 한 인수인 age를 사용하는 새로운 함수 printCakeCandles()를 만듭니다.
  2. 함수 안에서 repeat() 문을 사용하여 불꽃에 사용할 쉼표 , 하나를 출력합니다.
  3. age회 반복합니다.
  4. 마지막에 빈 줄을 출력합니다.
  5. print 문을 추가하여 초를 삽입할 공백을 하나 출력합니다.
  6. 그 아래에서 단계를 반복하여 두 번째 repeat() 문을 만들고 수직선(|)으로 초를 출력합니다.
  7. 마지막에 println()를 사용하여 새 줄을 출력합니다.
  8. main()에서 // 기호 두 개를 printCakeCandles() 코드 줄 시작 부분에서 삭제합니다.
printCakeCandles(age)
  1. 코드를 실행하여 케이크 상단과 초를 확인하세요.

솔루션:

fun printCakeCandles(age: Int) {
    print(" ")
    repeat(age) {
        print(",")
    }
    println() // Print an empty line

    print(" ") // Print the inset of the candles on the cake
    repeat(age) {
        print("|")
    }
    println()
}

printCakeBottom() 만들기

이 함수에서는 age + 2만큼 넓은 케이크 하단을 그리고 주어진 층수 대로 높게 그립니다.

@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
  • 즉, 함수에는 두 가지 인수가 필요합니다. 하나는 너비(age), 하나는 높이(layers)에 사용합니다.
  • 케이크의 하단을 출력하려면 먼저 'at' @ 기호를 age + 2회 반복하여 층 하나를 출력합니다. 그런 다음 한 층 출력을 layers회 반복합니다.

at 기호를 연령+2회 그려 층 만들기

  1. 기존 함수 아래에서 Int 유형의 두 인수 agelayers를 사용하여 printCakeBottom() 함수를 만듭니다.
  2. 함수 내에서 repeat() 문을 사용하여 'at' @ 기호를 age + 2회 반복한 층 하나를 출력합니다. 다음과 같이 빈 줄을 출력하여 완료합니다.
fun printCakeBottom(age: Int, layers: Int) {
    repeat(age + 2) {
        print("@")
    }
    println()
}
  1. main()에서 // 기호 두 개를 printCakeBottom(age, layers) 코드 줄 시작 부분에서 삭제합니다.
  2. 코드를 실행하여 케이크 하단 한 줄이 출력되었는지 확인합니다.
 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@

중첩 repeat() 문

케이크 하단의 동일한 층을 여러 개 출력하려면 다음과 같이 말할 수 있습니다.

층 1의 경우 기호를 12회 반복합니다. @@@@@@@@@@@@

층 2의 경우 기호를 12회 반복합니다. @@@@@@@@@@@@

층 3의 경우 기호를 12회 반복합니다. @@@@@@@@@@@@

또는 다음과 같이 훨씬 더 간결하게 말할 수도 있습니다.

층 3개의 경우 다음을 반복합니다.

기호를 12회 반복합니다.

@@@@@@@@@@@@

@@@@@@@@@@@@

@@@@@@@@@@@@

이제 repeat() 문을 사용하여 이 작업을 깔끔하게 실행할 수 있습니다. 한 repeat() 문을 다른 repeat() 문 내에 배치해도 됩니다. 따라서 repeat() 문 내에 repeat() 문을 만들어 특정 수의 층에 걸쳐 기호를 특정 횟수로 출력할 수 있습니다.

중첩 repeat()를 사용하여 케이크 층 출력

  1. 함수 내의 모든 코드에 두 번째 repeat() 문을 배치합니다. 이 루프를 layers회 반복합니다.
  2. main()printCakeBottom() 코드 줄에서 // 두 개만 삭제합니다.
printCakeBottom(age, layers)
  1. 코드를 실행하여 전체 케이크를 확인합니다.

printCakeBottom()의 솔루션입니다.

fun printCakeBottom(age: Int, layers: Int) {
    repeat(layers) {
        repeat(age + 2) {
            print("@")
        }
        println()
    }
}

축하합니다. 여러 함수와 중첩 repeat 문을 사용하는 꽤 복잡한 프로그램을 방금 완료했습니다. 이제 케이크에는 항상 적절한 수의 초가 있을 것입니다.

프로그램의 최종 출력은 다음과 같습니다.

 ,,,,,,,,,,,,,,,,,,,,,,,,
 ||||||||||||||||||||||||
==========================
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@

6. 솔루션 코드

fun main() {
    val age = 24
    val layers = 5
    printCakeCandles(age)
    printCakeTop(age)
    printCakeBottom(age, layers)
}

fun printCakeCandles(age: Int) {
    print (" ")
    repeat(age) {
          print(",")
    }
    println() // Print an empty line

    print(" ") // Print the inset of the candles on the cake
    repeat(age) {
        print("|")
    }
    println()
}

fun printCakeTop(age: Int) {
    repeat(age + 2) {
        print("=")
    }
    println()
}

fun printCakeBottom(age: Int, layers: Int) {
    repeat(layers) {
        repeat(age + 2) {
            print("@")
        }
        println()
    }
}

7. 문제 해결

브라우저 기반 Kotlin 프로그래밍 도구에서 코드를 실행하지 않거나 코드와 관계없는 예기치 않은 오류가 발생한다면 다음을 시도해 볼 수 있습니다.

  • Shift+Reload 키를 사용하여 페이지를 새로고침합니다.
  • 잠시 후 다시 시도합니다.

8. 요약

  • ${}를 사용하여 print 문 텍스트의 변수와 계산 값을 둘러쌉니다. 예를 들어 ${age}에서 age가 변수입니다.
  • val 키워드와 이름을 사용하여 변수를 만듭니다. 설정이 완료되면 변경할 수 없습니다. 등호를 사용하여 변수에 값을 할당합니다. 값의 예로는 텍스트와 숫자가 있습니다.
  • String"Hello"와 같이 따옴표로 묶인 텍스트입니다.
  • Int는 양의 정수 또는 음의 정수(예: 0, 23, -1024)입니다.
  • 함수에서 사용할 인수 한 개 이상을 함수에 전달할 수 있습니다. 예:fun printCakeBottom(age:Int, layers:Int) {}
  • repeat() {} 문을 사용하여 일련의 명령어를 여러 번 반복합니다. 예를 들면 repeat (23) { print("%") } 또는 repeat (layers) { print("@@@@@@@@@@") }이 있습니다.
  • 루프는 명령어를 여러 번 반복하는 명령어입니다. repeat() 문은 루프의 예입니다.
  • 루프를 중첩할 수 있습니다. 즉, 루프 내에 루프를 배치할 수 있습니다. 예를 들어 repeat() 문 내에 repeat() 문을 만들어 케이크 층을 만들 때처럼 여러 행에 걸쳐 기호를 여러 번 출력할 수 있습니다.

함수 인수 사용 요약: 함수에 인수를 사용하려면 다음 세 가지 작업을 실행해야 합니다.

  • 함수 정의에 인수와 유형을 추가합니다. printBorder(border: String)
  • 함수 내에서 인수를 사용합니다. println(border)
  • 함수 호출 시 인수를 제공합니다. printBorder(border)

9. 자세히 알아보기

다음은 이 Codelab에서 알아본 Kotlin 개념에 관한 공식 문서입니다.