개발/코틀린

(코틀린) 함수

DinoDev 2022. 9. 24. 17:03
728x90
반응형

함수

파라미터를 받아서 어떤 값을 반환하는 형태를 함수라고 이야기합니다.

파라미터가 없을 수도 있고 반환 값이 없을 수도 있습니다.

함수의 구조

함수는 fun 키워드를 사용해서 정의합니다.

fun functionName(param1: Int, param2: String, param3: Boolean): String {
    return """
        이 함수의 이름은 \`functionName\`이고
        함수의 파라미터는
        param1은 Int타입이고 값은 $param1,
        param2은 String타입이고 값은 $param2,
        param3은 Boolean타입이고 값은 $param3
        입니다.
    """.trimIndent()
}

fun noParamNoReturnValue() {
    // 파라미터와 반환값이 없는 함수도 만들 수 있습니다.
}

위치 기반 인자와 이름 붙은 인자

함수 파라미터는 기본적으로 순서대로 전달합니다. 이런 방식을 위치 기반 인자(positional argument)라고 부릅니다.

코틀린에서는 파라미터에 이름을 붙여서 순서와 상관없이 인자를 전달하는 방식인 이름 붙은 인자(named argument)방식을 지원합니다.

fun main() {
    functionName(param1 = 1, param2 = "2", param3 = true)
    functionName(param3 = false, param1 = 2, param2 = "3")
}

오버로딩과 디폴트 값

오버로딩이란 함수이름은 같지만 다른 함수로 인식하는 기능입니다.

오버로딩의 조건은 파라미터 타입이 다르거나 개수가 달라야 합니다.

fun functionOverloading(param: Int) {
    // Int 타입 파라미터 함수
}

fun functionOverloading(param: String) {
    // String 타입 파라미터 함수
}

fun functionOverloading(param: Boolean) {
    // Boolean 타입 파라미터 함수
}

함수 파라미터에 디폴트 값을 넣어서 인자를 받지 않더라도 동작하게 할 수 있습니다.

import kotlin.math.max
import kotlin.math.min

fun restrictToRange(
    what: Int,
    from: Int = Int.MIN_VALUE,
    to: Int = Int.MAX_VALUE,
): Int = max(from, min(to, what))

fun main() {
    // to를 넣지 않더라도 에러가 발생하지 않음
    restrictToRange(1, from = 10)
}

vararg 가변인자

파라미터의 개수가 정해지지 않았을 때 array형태로 전달할 수 있는 형태를 vararg라고 합니다

fun printSorted(vararg items: Int) {
    items.shuffle()
    println(items.contentToString())
}

fun main() {
    printSorted(1, 2, 3, 4, 5, 6, 7, 8, 9) // [3, 7, 5, 8, 2, 6, 1, 9, 4]

    val numbers = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9)
    // * 스프레드 연산자를 사용해서 배열을 가변인자로 전달 할 수 있습니다.
    printSorted(*numbers) // [3, 4, 5, 6, 1, 9, 8, 7, 2]
    // 스프레드 연산을 사용하면 배열을 복사하기 때문에 원본에는 변화가 없습니다.
    println(numbers.contentToString()) // [1, 2, 3, 4, 5, 6, 7, 8, 9]
}

보통 가변인자와 다른 파라미터를 같이 사용해야 한다면 가변인자를 가장 마지막에 선언한다.

fun printSorted(prefix: String = "", vararg items: Int) {
    items.shuffle()
    println("$prefix ${items.contentToString()}")
}

fun main() {
    printSorted("prefix", 1, 2, 3, 4, 5, 6, 7, 8, 9)
}

함수의 영역과 가시성

함수는 정의된 위치에 따라 세 가지로 구분할 수 있습니다.

  • 파일에 직접 선언된 최상위 함수
  • 어떤 타입 내부에 선언된 멤버 함수
  • 다른 함수 안에 선언된 지역 함수

함수의 가시성은 private, protected, internal, public이고 아무것도 넣지 않으면 디폴트로 public으로 선언됩니다.

최상위 함수를 private으로 선언한 경우 같은 파일 안에서만 접근이 되고 internal로 선언하면 같은 모듈 안에서만 접근이 됩니다.

함수 안에 선언된 지역 함수는 가시성을 붙일 수 없고 선언한 함수 안에서만 접근 가능합니다.

728x90
반응형