뭐라도 끄적이는 BLOG

Kotlin 함수 본문

Kotlin

Kotlin 함수

Drawhale 2023. 7. 3. 12:02

함수 선언

Kotlin에서 함수를 선언하기 위해 fun 키워드를 사용한다.

fun hello(){
    return println("Hello, world!")
}
  • 함수 매개 변수는 괄호안에 작성된다.
  • 각 매개변수에는 타입이 있어야 하며 여러 매개변수는 쉼표로 구분해야 한다.
  • 반환 유형은 함수의 괄호 뒤에 콜론으로 구분하여 작성한다.
  • 함수 본문은 중괄호 안에 작성한다.
  • return 키워드로 함수를 종료하거나 함수에서 값을 반환하는 데 사용된다.
  • 함수에서 반환할 것이 없을땐 반환 타입은 Unit을 사용한다. 함수 본문에서 Unit이 반환된다고 명시적으로 선언 할 필요는 없다.
fun printMessage(message: String) {
    println(message)
    // `return Unit` or `return` is optional
}

fun sum(x: Int, y: Int): Int {
    return x + y
}

fun main() {
    println(sum(1, 2))
}
coding conventions에서는 함수의 이름은 소문자로 시작하고 camel case를 사용할 것을 권장한다.

함수의 매개변수

Named arguments

간결한 코드를 위해 함수를 호출할 때 매개변수 이름을 포함할 필요는 업삳. 하지만 매개변수 이름을 포함하면 코드를 더 읽기 쉽게 만들 수 있다. 이를 Named arguments를 사용한다고 한다. Named arguments를 사용하면 어떤 순서로든 매개변수를 작성할 수 있다.

fun printMessageWithPrefix(message: String, prefix: String = "Info") {
    println("[$prefix] $message")
}

fun main() {
    // Uses named arguments with swapped parameter order
    printMessageWithPrefix(prefix = "Log", message = "Hello")
    // [Log] Hello
}

Default parameter values

함수 매개변수의 기본값을 정의 할 수 있다. 함수를 호출 할 때 기본값이 있는 매개변수는 생략할 수 있다.

fun printMessageWithPrefix(message: String, prefix: String = "Info") {
    println("[$prefix] $message")
}

fun main() {
    // Function called with both parameters
    printMessageWithPrefix("Hello", "Log") 
    // [Log] Hello
    
    // Function called only with message parameter
    printMessageWithPrefix("Hello")        
    // [Info] Hello
    
    printMessageWithPrefix(prefix = "Log", message = "Hello")
    // [Log] Hello
}

다른 언어들처럼 Default parameter를 가장 오른쪽 매개변수부터 넣을 필요는 없다. 하지만 중간에 Dafault parameter를 사용한다면 사용자는 Dafault parameter를 사용하기 위해 반드시 Default parameter이후 변수들에 Named arguments를 사용해야 한다.

fun main() {
    printMessage("Hello", third = "!")
    printMessage("Hello", "world", "!")
}

fun printMessage(first: String, second: String = "Info", third: String) {
    println("$first $second $third")
}

단일 표현식 함수

코드를 더 간결하게 만들기 위해 단일 표현식 함수를 사용할 수 있다.

fun sum1(x: Int, y: Int): Int {
    return x + y
}

fun sum2(x: Int, y: Int) = x + y

fun main() {
    println(sum1(1, 2))
    println(sum2(1, 2))
    // 3
}

sum1과 sum2는 같은 동작을 하는 함수다. sum2에서 중괄호를 제거하고 할당 연산자를 사용하여 함수 본문을 선언하는 것을 볼 수 있다. 또한 타입 추론 기능으로 반환 타입을 생략할 수도 있다. 반환 타입을 생략하는 것은 함수 본문이 없는 경우에만 가능하다.

꼬리 재귀 함수 (tailrec)

Kotlin은 꼬리 재귀 함수형 프로그래밍을 지원한다. 스택 오버플로우의 위험 없이 재귀 함수를 사용할 수 있다. 함수에 tailrec  키워드를 넣어 필요한 조건을 충족하는 경우 컴파일러는 재귀를 최적화한다.

import java.math.BigInteger

tailrec fun fibonacci(n:Int, a:BigInteger, b:BigInteger):BigInteger {
    return if(n==0) a else fibonacci(n=n-1, a=b, b=a+b)
}

fun main() {
    println(fibonacci(100, BigInteger("0"), BigInteger("1")))
}

tailrec을 사용하려면 함수가 수행하는 마지막 연산으로 자신을 호출해야 한다. 

반응형

'Kotlin' 카테고리의 다른 글

Kotlin Lambda  (0) 2023.07.03
Kotlin 제어문(조건문: if/when, 제어문: for/while)  (0) 2023.07.01
Kotlin 변수와 데이터 타입  (0) 2023.07.01
Hello Kotlin  (0) 2023.06.30