학습할 내용

  • 자체 함수를 정의하고 호출하는 방법
  • 변수에 저장할 수 있는 값을 함수에서 반환하는 방법
  • 여러 매개변수를 사용하여 함수를 정의하고 호출하는 방법
  • 이름이 지정된 인수를 사용하여 함수를 호출하는 방법
  • 함수 매개변수의 기본값을 설정하는 방법

함수 정의 및 호출하기

Kotlin 플레이그라운드를 열고 기존 코드를 다음 프로그램으로 바꿉니다.

fun main() {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}

Kotlin에서 모든 코드를 main() 함수 안에 포함하는 것도 가능하지만, 효율적이지 않은 경우가 있습니다. 특정 작업을 실행하는 개별 함수를 만들면 여러 가지 이점이 있습니다.

  • 재사용 가능한 코드: 두 번 이상 사용해야 하는 코드를 복사하여 붙여넣는 대신 필요할 때마다 함수를 호출하면 됩니다.
  • 가독성: 함수가 한 가지 특정 작업만 실행하도록 하면 다른 개발자와 팀원은 물론 향후 본인도 코드가 하는 작업을 정확히 파악할 수 있습니다.

main() 함수 아래에 birthdayGreeting()이라는 새 함수를 정의합니다.

fun main() {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}

fun birthdayGreeting() {
    
}

println() 문 두개를 main()에서 birthdayGreeting() 함수의 중괄호 안으로 이동하고, main() 함수에서 birthdayGreeting() 함수를 호출합니다.

fun main() {
    birthdayGreeting()
}

fun birthdayGreeting() {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}

코드를 실행하면 다음과 같이 출력이 표시됩니다.

Happy Birthday, Rover!
You are now 5 years old!

함수에서 값 반환하기

Kotlin 함수는 반환 값이라는 데이터를 생성할 수 있습니다. 반환 값은 변수에 저장하여 코드의 다른 곳에서 사용할 수 있습니다. 함수를 정의할 때 함수가 반환하도록 하려는 값의 데이터 유형을 지정할 수 있습니다. 함수 본문 내에서는 모든 문 뒤에서 return 문을 사용하여 함수가 반환하도록 할 값을 지정합니다.

fun 함수이름(): 데이터유형 {
    본문
    return 반환값
}

Unit 유형

반환 유형을 지정하지 않으면 기본적으로 Unit이 됩니다. Unit은 함수가 값을 반환하지 않음을 의미합니다. 다른 언어의 void 반환 유형과 동일합니다. 다음 프로그램을 실행해보면 이전과 동일하게 작동합니다.

fun main() {
    birthdayGreeting()
}

fun birthdayGreeting(): Unit {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}

birthdayGreeting()에서 String 반환하기

Unit 반환 유형을 String으로 바꿉니다.

fun main() {
    birthdayGreeting()
}

fun birthdayGreeting(): String {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
}

코드를 실행하면 오류가 발생합니다. 함수의 반환 유형을 선언할 경우 return 문을 포함해야 합니다.

Missing return statement.

함수는 하나의 문자열만 반환할 수 있습니다. 일단 println() 문을 2개의 변수로 바꿉니다.

fun main() {
    birthdayGreeting()
}

fun birthdayGreeting(): String {
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
}

함수가 두 인사말로 구성된 문자열을 반환하도록 return문을 추가합니다. 각각의 인사말을 개별 행에 출력하려면 \n 이스케이프 문자를 사용합니다.

fun main() {
    birthdayGreeting()
}

fun birthdayGreeting(): String {
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}

birthdayGreeting()이 값을 반환하므로 main()에서 결과를 문자열 변수에 저장할 수 있습니다.

fun main() {
    val greeting = birthdayGreeting()
    println(greeting)
}

fun birthdayGreeting(): String {
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}

birthdayGreeting()함수를 println()함수 안에서 호출할 수도 있습니다.

fun main() {
    println(birthdayGreeting())
}

fun birthdayGreeting(): String {
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}

birthdayGreeting() 함수에 매개변수 추가하기

println()을 호출할 때 괄호 안에 문자열을 전달할 수 있습니다. birthdayGreeting()에 매개변수를 추가하여 같은 작업을 할 수 있습니다.

fun 함수이름(매개변수): 데이터유형 {
    본문
    return 반환값
}

birthdayGreeting() 함수에 String 유형의 name 매개변수를 추가합니다.

fun main() {
    println(birthdayGreeting())
}

fun birthdayGreeting(name: String): String {
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}

매개변수는 val 키워드를 사용하여 선언한 변수처럼 작동합니다. 그 값은 birthdayGreeting() 함수의 어디서나 사용할 수 있습니다. nameGreeting 문자열에서 Rovername 매개변수로 바꿉니다.

fun main() {
    println(birthdayGreeting())
}

fun birthdayGreeting(name: String): String {
    val nameGreeting = "Happy Birthday, $name!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}

코드를 실행하면 오류가 발생합니다.

No value passed for parameter 'name'.

name 매개변수를 선언했으므로 birthdayGreeting()을 호출할 때 String을 전달해야 합니다. "Rover"main()birthdayGreeting() 호출에 전달합니다.

fun main() {
    println(birthdayGreeting("Rover"))
}

fun birthdayGreeting(name: String): String {
    val nameGreeting = "Happy Birthday, $name!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}

코드를 실행합니다. 여기서 이름 Rover는 name 매개변수에서 가져온 것입니다.

Happy Birthday, Rover!
You are now 5 years old!

Rover가 아닌 다른 이름으로 호출할 수 있습니다.

fun main() {
    println(birthdayGreeting("Rover"))
    println(birthdayGreeting("Rex"))
}

fun birthdayGreeting(name: String): String {
    val nameGreeting = "Happy Birthday, $name!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}

코드를 실행합니다.

Happy Birthday, Rover!
You are now 5 years old!
Happy Birthday, Rex!
You are now 5 years old!

여러 매개변수를 갖는 함수

하나의 함수에 둘 이상의 매개변수를 정의할 수도 있고, 서로 다른 데이터 유형의 매개변수를 정의하는 것도 가능합니다.

birthdayGreeting() 함수의 name 매개변수 뒤에 Int 유형의 age 매개변수를 추가합니다. ageGreeting 문자열에 age 매개변수의 값을 사용하도록 birthdayGreeting() 함수를 업데이트합니다.

fun main() {
    println(birthdayGreeting("Rover"))
    println(birthdayGreeting("Rex"))
}

fun birthdayGreeting(name: String, age: Int): String {
    val nameGreeting = "Happy Birthday, $name!"
    val ageGreeting = "You are now $age years old!"
    return "$nameGreeting\n$ageGreeting"
}

코드를 실행하면 오류가 발생합니다.

No value passed for parameter 'age'.
No value passed for parameter 'age'.

main()에서 birthdayGreeting() 함수 호출이 나이를 전달하도록 수정합니다.

fun main() {
    println(birthdayGreeting("Rover", 5))
    println(birthdayGreeting("Rex", 2))
}

fun birthdayGreeting(name: String, age: Int): String {
    val nameGreeting = "Happy Birthday, $name!"
    val ageGreeting = "You are now $age years old!"
    return "$nameGreeting\n$ageGreeting"
}

코드를 실행합니다. 이름과 나이가 반영된 문자열이 출력됩니다.

Happy Birthday, Rover!
You are now 5 years old!
Happy Birthday, Rex!
You are now 2 years old!

함수 서명

입력(매개변수)이 있는 함수 이름을 총칭하여 함수 서명이라고 합니다. 함수 서명은 반환 유형 앞의 모든 내용으로 구성됩니다.

fun birthdayGreeting(name: String, age: Int)

이름이 지정된 인수

여러 개의 매개변수를 갖는 함수를 호출하거나 인수를 다른 순서로 전달하려는 경우 매개변수의 이름을 지정할 수 있습니다. 함수를 호출할 때 매개변수 이름을 포함하면 이름이 지정된 인수라고 합니다.

fun main() {
    println(birthdayGreeting(name = "Rover", age = 5))
    println(birthdayGreeting(age = 2, name = "Rex"))
}

fun birthdayGreeting(name: String, age: Int): String {
    val nameGreeting = "Happy Birthday, $name!"
    val ageGreeting = "You are now $age years old!"
    return "$nameGreeting\n$ageGreeting"
}

코드를 실행합니다. 인수의 순서를 변경했지만 동일한 매개변수에 동일한 값이 변경된 것을 알 수 있습니다.

Happy Birthday, Rover!
You are now 5 years old!
Happy Birthday, Rex!
You are now 2 years old!

기본값 인수

기본값 인수를 추가하려면 매개변수의 데이터 유형 뒤에 = 할당 연산자를 추가하고 원하는 값을 설정합니다. 함수를 호출할 때 기본값이 있는 인수는 생략할 수 있습니다. 생략하는 경우 기본값이 사용됩니다.

다음과 같이 코드를 수정합니다.

fun main() {
    println(birthdayGreeting(age = 5))
    println(birthdayGreeting("Rex", 2))
}

fun birthdayGreeting(name: String = "Rover", age: Int): String {
    val nameGreeting = "Happy Birthday, $name!"
    val ageGreeting = "You are now $age years old!"
    return "$nameGreeting\n$ageGreeting"
}

main()의 첫번째 birthdayGreeting() 호출에서 age 매개변수는 이름이 지정된 인수 age를 사용해야 합니다. 이름이 지정된 인수를 사용하지 않으면 Kotlin은 인수의 순서가 매개변수가 정의된 순서와 동일하다고 가정합니다. 이름이 지정된 인수는 Kotlin이 age 매개변수에 Int 값이 올 것을 예상하도록 하는데 사용됩니다.

정리

  • 함수는 fun 키워드를 사용하여 정의되며, 재사용 가능한 코드를 포함합니다.
  • 함수는 값을 반환할 수 있으며, 반환된 값은 변수에 저장하여 나중에 사용할 수 있습니다.
  • 함수는 매개변수를 받을 수 있습니다. 매개변수는 함수 본문 안에서 사용할 수 있는 변수입니다.
  • 인수는 사용자가 함수를 호출할 때 전달하는 값입니다.
  • 이름이 지정된 인수를 사용하면 인수의 순서를 바꿀 수 있습니다.
  • 기본값 인수를 지정하면 함수를 호출할 때 인수를 생략할 수 있습니다.

📚 참고: Android Developers 공식 Kotlin 학습 자료 본 글은 Android Developers의 Kotlin 교육 콘텐츠를 참고하여 재구성했습니다.

카테고리:

업데이트:

댓글남기기