제이슨의 개발이야기

코틀린 scope 함수에 대해서 apply , run , with , also , let 본문

컴퓨터과학

코틀린 scope 함수에 대해서 apply , run , with , also , let

제이쓰은 2022. 11. 19. 16:55
728x90
반응형

 

안녕하세요 

오늘은 코틀린 스코프 함수에 대해서 공부하려고 합니다! 

 

코틀린 범위 지정 함수에는 5개의 함수가 있는대

apply, run , with , also , let 이 있습니다

 

일단 

스코프 함수란 

함수형 언어의 특징을 좀 더 편리하게 사용할 수 있도록 제공하는 라이브러리 함수 입니다

 

 

 

1.apply

 

apply는 인스턴스를 생성한 후 변수에 담기 전에 초기화 과정을 수행할 때 많이 쓰입니다

val adam = Person("Adam").apply {
    age = 32
    city = "London"        
}
println(adam)

 

 

2. run

run은 apply처럼 스코프 안에서 참조 연산자를 사용하지 않아도 된다는 점은 같지만 일반 람다 함수 처럼 인스턴스 대신 마지막에 결과값을 반환하는 차이가 있습니다

    var d = Point(1,2).apply {
        x=10
    }

    var s = d.run {
        x
    }

    println(s)
    // 10출력

 

3. with

with는 run과 동일한 기능을 가지지만 단지 인스턴스를 참조 연산자 대신 파라미터로 받는다는 차이 뿐입니다

    var d = Point(1,2).apply {
        x=10
    }

    var t = with(d){
        d.x
    }

    println(t)

4. let

 

let은 run과 같은 기능을 갖지만 한가지 차이가 있다면 참조 연산자 없이 인스턴스의 변수와 함수를 사용할 수 있었다면 

let은 마치 파라미터로 인스턴스를 넘긴것처럼 it을 통해서 인스턴스를 사용할 수 있습니다

왜 let은 굳이 파라미터를 통해서 인스턴스를 사용하는 귀찮은 과정을 거칠까?

 -> 이는 같은 이름의 변수나 함수가 scope 바깥에 중복되어 있는 경우에 혼란을 방지하기 위함

 

fun main() = with(System.out.bufferedWriter()) {

    var x = 10

    var d = Point(1,2)


    d.let {
        println(it.x) // 1출력
    }

    d.run {
        println(x)// 10출력 main에서 생성한 변수 x가 우선 순위가 높음
    }

}

 

5.also

 

also 는 apply와 같은 기능을 하지만 앞서 let과 마찬가지로  참조 연산자 없이 인스턴스의 변수와 함수를 사용할 수 있었다면

also는 마치 파라미터로 인스턴스를 넘긴것처럼 it을 통해서 인스턴스를 사용할 수 있습니다

fun main() = with(System.out.bufferedWriter()) {

    var x = 10

    var d = Point(1,2).also {
        it.x = 100
    }

    println(d.x)


}

 

 

마지막으로

 

스코프 함수는 인스턴스의 속성이나 함수를 스코프 내에서 깔끔하게 분리하여 사용할 수 있어 코드의 가독성을 향상 시킬 수 있는 장점이 있습니다

728x90
반응형