본문 바로가기
개발&프로그래밍

[Kotlin] 함수

by 재아군 2024. 8. 18.

Kotlin 함수

Kotlin에서 함수는 프로그램의 기본 구성 요소입니다. 이 가이드에서는 Kotlin 함수의 다양한 측면을 상세히 살펴보겠습니다.

 

kotlin 함수(Function)

 

함수 기본 (Function Basics)

Kotlin에서 함수는 fun 키워드를 사용하여 선언합니다:

fun double(x: Int): Int {
    return 2 * x
}

 

함수를 호출할 때는 일반적인 방식을 사용합니다:

val result = double(2)

 

 

멤버 함수를 호출할 때는 점 표기법을 사용합니다:

Stream().read() // Stream 클래스의 인스턴스를 생성하고 read() 메서드 호출

 

 

매개변수 (Parameters)

함수 매개변수는 Pascal 표기법(name: type)을 사용하여 정의합니다:

fun powerOf(number: Int, exponent: Int): Int { /*...*/ }

매개변수 선언 시 후행 쉼표를 사용할 수 있습니다:

fun powerOf(
    number: Int,
    exponent: Int, // 후행 쉼표
) { /*...*/ }

 

기본 인자 (Default Arguments)

함수 매개변수는 기본값을 가질 수 있습니다:

fun read(
    b: ByteArray,
    off: Int = 0,
    len: Int = b.size,
) { /*...*/ }

이는 오버로딩의 필요성을 줄여줍니다.

 

 

명명된 인자 (Named Arguments)

함수를 호출할 때 하나 이상의 인자에 이름을 지정할 수 있습니다:

fun reformat(
    str: String,
    normalizeCase: Boolean = true,
    upperCaseFirstLetter: Boolean = true,
    divideByCamelHumps: Boolean = false,
    wordSeparator: Char = ' ',
) { /*...*/ }

reformat("This is a long String!")
reformat("This is a short String!", upperCaseFirstLetter = false, wordSeparator = '_')

이는 특히 많은 매개변수를 가진 함수를 호출할 때 유용합니다.

 

 

Unit을 반환하는 함수 (Unit-returning Functions)

유용한 값을 반환하지 않는 함수의 반환 타입은 Unit입니다:

fun printHello(name: String?): Unit {
    if (name != null)
        println("Hello $name")
    else
        println("Hi there!")
    // `return Unit` 또는 `return`은 선택사항입니다
}

Unit 반환 타입 선언은 생략할 수 있습니다.

 

 

단일 표현식 함수 (Single-expression Functions)

함수 본문이 단일 표현식으로 구성된 경우, 중괄호를 생략하고 = 기호 뒤에 본문을 지정할 수 있습니다:

fun double(x: Int): Int = x * 2

컴파일러가 반환 타입을 추론할 수 있는 경우 반환 타입 선언도 생략할 수 있습니다:

fun double(x: Int) = x * 2

 

 

가변 인자 (Varargs)

함수의 매개변수(주로 마지막 매개변수)를 vararg 수식어로 표시할 수 있습니다:

fun <T> asList(vararg ts: T): List<T> {
    val result = ArrayList<T>()
    for (t in ts) // ts는 배열입니다
        result.add(t)
    return result
}

val list = asList(1, 2, 3)

이미 배열이 있는 경우 스프레드 연산자(*)를 사용하여 함수에 전달할 수 있습니다:

val a = arrayOf(1, 2, 3)
val list = asList(-1, 0, *a, 4)

 

 

중위 표기법 (Infix Notation)

infix 키워드로 표시된 함수는 중위 표기법을 사용하여 호출할 수 있습니다:

infix fun Int.shl(x: Int): Int { ... }

// 중위 표기법을 사용한 함수 호출
1 shl 2

// 다음과 동일합니다
1.shl(2)

 

 

함수 스코프 (Function Scope)

Kotlin 함수는 파일의 최상위 레벨, 로컬 함수, 멤버 함수, 확장 함수로 선언될 수 있습니다.

로컬 함수 (Local Functions)

Kotlin은 함수 내부에 함수를 선언할 수 있는 로컬 함수를 지원합니다:

fun dfs(graph: Graph) {
    fun dfs(current: Vertex, visited: MutableSet<Vertex>) {
        if (!visited.add(current)) return
        for (v in current.neighbors)
            dfs(v, visited)
    }

    dfs(graph.vertices[0], HashSet())
}

 

제네릭 함수 (Generic Functions)

함수는 제네릭 매개변수를 가질 수 있습니다:

fun <T> singletonList(item: T): List<T> { /*...*/ }

 

 

꼬리 재귀 함수 (Tail Recursive Functions)

Kotlin은 꼬리 재귀라고 알려진 함수형 프로그래밍 스타일을 지원합니다:

val eps = 1E-10 // "충분히 작은" 값, 10^-15일 수도 있습니다

tailrec fun findFixPoint(x: Double = 1.0): Double =
    if (Math.abs(x - Math.cos(x)) < eps) x else findFixPoint(Math.cos(x))

tailrec 수식어를 사용하면 컴파일러가 재귀를 최적화하여 빠르고 효율적인 루프 기반 버전으로 변환합니다.

 

 

Kotlin의 함수는 다양한 기능과 유연성을 제공합니다. 기본 인자, 명명된 인자, 단일 표현식 함수 등의 기능은 코드를 더 간결하고 읽기 쉽게 만들어줍니다. 가변 인자, 중위 표기법, 로컬 함수 등의 고급 기능은 더 표현력 있는 코드를 작성할 수 있게 해줍니다. 제네릭 함수와 꼬리 재귀 최적화는 성능과 타입 안전성을 모두 고려한 강력한 도구입니다.

이러한 다양한 기능을 적절히 활용하면, 더 안전하고, 읽기 쉽고, 유지보수가 용이한 코드를 작성할 수 있습니다. 특히 함수형 프로그래밍 패러다임을 따르는 프로젝트에서 Kotlin의 함수 기능은 큰 강점을 발휘합니다.

 


Kotlin, 함수, 매개변수, 기본인자, 명명된인자, 단일표현식함수, 가변인자, 중위표기법, 로컬함수, 제네릭함수, 꼬리재귀, 함수형프로그래밍, 코틀린문법, 안드로이드개발, 서버개발

댓글