HOME > kotlin > basic

Kotlin - 함수를 정의하는 다양한 방법 알아보기

JSFollow06 Mar 2019

코틀린에서 함수를 정의하는 여러가지 방법과 특성에 대해서 알아보겠습니다. 코틀린은 완전히 함수형 프로그래밍 언어는 아니지만 최근에 생긴 언어답게 함수형 언어의 특징을 갖고 있습니다. 또한, 자바와 비슷하지만 자바보다 함수 정의 방법에 대해서 더 많은 자유도를 줍니다.

기본적인 함수 정의 방법

기본적으로 함수는 아래와 같이 정의합니다. 함수는 fun 키워드로 시작하며 리턴 타입은 : String처럼 세미콜론 다음에 적어줍니다.

fun hello() : String {
    return "hello world"
}

만약 인자를 받고 싶다면 name: String처럼 변수 이름과 그 변수의 타입은 : String처럼 세미콜론 다음에 적어줘야 합니다.

fun hello2(name: String) : String {
    return "hello, my name is $name"
}

리턴 값이 없을 때는 Java가 void를 사용하는 것처럼 코틀린은 Unit을 사용합니다.

fun hello3(str: String): Unit {
    println(str)
}

리턴 타입 Unit은 아래처럼 생략할 수도 있습니다.

fun hello4(str: String) {
    println(str)
}

Single expression functions(한 줄로 함수를 정의하는 방법)

Single expression functions는 한줄로 함수를 정의하는 방법을 말합니다.

위에서 정의한 hello world를 리턴하는 함수는 아래처럼 한줄로 정의할 수 있습니다.

fun hello5() : String = "hello world"

인자를 사용한 함수도 이렇게 한줄로 정의할 수 있습니다.

fun hello6(name: String): String = "hello, my name is $name"

기본적인 함수 정의 방법과는 다르게 Single expression functions는 컴파일러가 리턴 타입을 추론할 수 있다면 생략해도 됩니다. 아래 코드는 "hello world"를 리턴하고 타입은 String입니다. 컴파일러가 이 함수는 String을 리턴한다고 추론할 수 있기 때문에 이렇게 생략할 수 있습니다.

fun hello7() = "hello world"

Local funtions(지역 함수)

Local functions(지역 함수)는 함수 안에 함수를 정의하는 방법입니다. 함수 안에 정의된 함수는 외부에서 사용할 수 없고 함수 내부에서만 사용할 수 있습니다. 함수 내부에서 동일한 코드를 반복적으로 사용해야 한다면 Local functions를 정의하여 중복 코드를 줄일 수 있습니다.

아래 코드는 dfs라는 재귀함수를 Local functions로 정의하였습니다.

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

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

Local functions의 장점은 자신을 정의한 부모 함수의 변수에 접근할 수 있다는 것입니다.

위의 코드에서 dfs함수는 인자는 두개인데요. 이 중에서 HashSet()을 부모 변수에 정의하고 (마치 전역변수처럼) 지역변수 내에서 사용할 수 있습니다. 아래처럼 코드를 변경하니 인자가 1개 줄어들었습니다. 더 깔끔해졌네요.

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

    dfs(graph.vertices[0])
}

Member functions(멤버 함수)

Member functions(멤버 함수)는 클래스의 멤버로 정의된 함수를 말합니다. 자바 프로그래머라면 익숙하게 보던 형태입니다.

class Sample() {
    fun foo() { print("Foo") }
}

외부에서는 클래스 객체를 통해 호출을 할 수 있습니다.

Sample().foo()

정리

코틀린에서 함수를 정의하는 다양한 방법과 함수의 사용방법에 대해서 간단히 알아보았습니다. 이 글의 코드 중 일부는 Kotlin - 함수 정의 및 사용 방법를 참고하였습니다. 이 페이지를 참고하시면 더 자세한 함수의 사용방법에 대해서 알 수 있습니다.

참고