본문 바로가기

프로그래밍/코틀린

[코틀린] 일급 객체로서의 함수

코틀린에서 함수가 일급 객체로 활용되는 부분에 대해서 살펴보겠다.

 

코틀린의 함수 내에는 다양한 구성요소를 포함시킬 수 있다.

fun superFun() {
    val superData = "hello"

    fun subFun1() {
        println("subFun1() .. superData : $superData")
    }

    fun subFun2(a: Int, b: Int): Int {
        subFun1()
        return a + b
    }

    class SubClass{
        fun classFun(){
            println("classFun() .. superData : ${superData}")
        }
    }

    subFun1()
    SubClass().classFun()
}

함수를 클래스에 포함하지 않고, 함수 내부에 변수, 함수, 클래스를 선언했다.

 

함수를 변수처럼 이용할 수 있다.

 

val funVal = fun someFun(){
}  //에러가 난다.

변수를 선언하듯이 함수를 대입해보았다.

하지만 이런 일반적인 방법으로는 컴파일 에러가 난다.

 

코틀린에서 함수를 변수에 대입하려면 람다 함수 또는 함수 참조(Function Reference)를 이용해야한다.

fun main() {
    val funVal1 = { x: Int ->
        println("hello world")
        x * 10
    }
    println("value : ${funVal1(10)}")
}

위의 소스코드는 람다 함수를 사용하여 변수에 대입했다.

funVal1(10)처럼 변수를 함수처럼 사용이 가능하다.

 

10이라는 값을 전달하고, hello world를 출력한 후,

x * 10 (10 * 10)을 리턴하여 funVal1에 값을 넣어주게 된다.

그렇기에 아래와 같은 결과 값이 나오게 된다.

[결과값]
hello world
value : 100

 

코틀린에서 함수를 변수에 대입하는 방법은 위처럼 람다 함수를 많이 이용하지만,

함수 참조를 이용할 수도 있다.

함수 참조를 이용한다는 것은 ::이라는 연산자를 이용하여 함수를 변수에 대입하는 방법이다.

fun someFun(){
    println("i am some function")
}

val funVal2 = ::someFun

fun main() {
    funVal2()
}

이러한 함수 참조는 리플렉션(Reflection) 기법이라고 하며 나중에 자세히 설명하겠다.

여기에서는 ::이라는 연산자로 함수를 변수에 대입할 수 있다 정도만 알고 넘어가도록 하자.