본문 바로가기
컴퓨터 언어/Kotlin

[Kotlin] 영역 함수 (run, let, with, apply, also)

by 웅대 2022. 12. 21.
728x90

코틀린에는 영역 함수라는 것이 존재한다.

 

영역 함수를 사용하면 특정 객체에 대한 식이라는 것을 알 수 있어서 가독성이 좋아진다.

 

영역 함수 모두 사용하는 목적은 비슷하지만 사용 방식에 있어서 약간의 차이점들이 존재한다.

 

객체 반환 여부에 따라서 구분해보자면 run, let, let과 apply, also로 나눌 수 있다.

 

먼저 영역 함수를 사용하지 않을 때와 사용할 때를 비교해보겠다.

 

사용하지 않을 때

    class Student(){
        var number = ""
        var name = ""
        fun printInfo(){
            println("your number : $number your name : $name")
        }
    }
    val s = Student()
    s.number = "1234"
    s.name = "chulsoo"
    s.printInfo()

사용할 때

    class Student(){
        var number = ""
        var name = ""
        fun printInfo(){
            println("your number : $number your name : $name")
        }
    }
    Student().run{
        number = "1234"
        name = "chulsoo"
        printInfo()
    }

 

기능 자체는 큰 차이가 없다. 그러나 후자의 경우 영역 함수 안에 있는 코드들이 Student 클래스와 관련된 코드라는 것을 한눈에 확인할 수 있다.

 

이제 각각의 영역 함수들의 차이점과 사용 방법에 대해 공부해보려 한다.

 

run, let, with의 경우 함수 안 마지막 값을 반환하고 apply, also의 경우 객체를 반환한다.

 

이 의미는 아래 예시를 보면 이해할 수 있다.

 

다음 Student 클래스를 기준으로 설명해보려 한다.

    class Student(){
        var number = ""
        var name = ""
        fun printInfo(){
            println("your number : $number your name : $name")
        }
    }
run
    Student().run{
        number = "1234"
        name = "chulsoo"
        printInfo()
    }

run 함수 안의 코드가 실행되고 run 함수의 반환 값은 마지막 값이다.

 

위의 경우 따로 반환하는 값이 없지만 아래와 같이 영역 함수를 사용하여 반환 값을 저장할 수도 있다.

    val res = Student().run{
        number = "1234"
        name = "chulsoo"
        "your number : $number your name : $name"
    }
    //res의 저장 값 : your number : 1234 your name : chulsoo

 

let
    Student().let{
        it.number = "1234"
        it.name = "chulsoo"
        it.printInfo()
    }

run과 거의 동일하지만 다른 점은 run의 경우 프로퍼티를 바로 호출할 수 있지만 let의 경우 it을 거쳐서 프로퍼티를 호출할 수 있다.

 

마찬가지로 마지막 값이 반환값이 된다.

with
    with(Student()){
        number = "1234"
        name = "chulsoo"
        printInfo()
    }

run과 유사하게 it을 거치지 않고 바로 변수를 호출할 수 있다.

 

그러나 with 함수의 인자로 클래스 객체를 받는다.

 

마찬가지로 마지막 값이 반환값이 된다.

 

지금까지는 함수의 반환 값이 함수 안의 마지막 값이었다.

 

apply와 also는 함수의 반환 값이 객체이다.

 

apply
    Student().apply{
        number = "1234"
        name = "chulsoo"
    }.printInfo()

apply의 경우 객체를 반환하기 때문에 위의 예시에서는 number의 값이 "1234", name의 값이 "chulsoo"인 Student 객체를 반환하게 된다. 

 

반환받은 객체의 printInfo 함수를 실행하는 모습이다.

 

also
    Student().also{
        it.number = "1234"
        it.name = "chulsoo"
    }.printInfo()

apply와 유사하지만 프로퍼티를 바로 호출하지 않고 it을 거쳐서 호출한다.

 

마찬가지로 객체를 반환한다.

let을 이용하여 null에 대한 안정성을 확보할 수 있다.

    
    item?.let{
        ...
        //item이 null이 아닐 때 안의 내용을 실행한다.
    }
728x90
반응형

댓글