[Kotlin] Scope Function

DaeHoon·2022년 2월 6일
0

Scope Function

  • Kotlin 표준 라이브러리는 몇 가지 객체의 Context 내에서 코드 블록{}을 실행하는 것을 목적으로 하는 몇 가지 함수들이 있다. 제공된 람다 식을 사용해 객체에서는 이러한 함수를 호출하면 임시적인 Scope가 생성된다. 이 Scope에서는 이름 없이 Object에 접근할 수 있다. 이러한 기능을 Scope Function이라고 한다.

1. apply

  • 인스턴스를 새로 생성하고 특정 변수에 할당하기 전에 초기화 작업을 해주는 스코프를 만들어 준다.
  • 스코프 안의 내용이 수행된 이후 만들었던 인스턴스를 반환한다.
fun main(){
    var a = Book("스프링 짱짱", 12000).apply {
        name = "코틀린" + name
        discount()
    }
    println("상품명 : ${a.name}, 가격: ${a.price}")
    
}

class Book(var name: String, var price: Int) {
    fun discount(){
        price-=2000
    }
}

2. run

  • apply와 마찬가지로 스코프 안에서 인스턴스의 프로퍼티에 접근이 가능하다.
  • 생성된 인스턴스를 반환하는 apply와 다르게 최종 표현식을 반환한다. 반환식이 없으면 Unit을 반환한다.
fun main(){
    var a = Book("스프링 짱짱", 12000).apply {
        name = "코틀린" + name
        discount()
    }

    var cost = a.run{
        price+= 10000
        price+10000
    }
    // 타이틀 : 코틀린스프링 짱짱, 가격 : 20000, 30000
    println("타이틀 : ${a.name}, 가격 : ${a.price}, ${cost}")
}

class Book(var name: String, var price: Int) {
    fun discount(){
        price-=2000
    }
}

3. with

  • run과 똑같이 동작하나 인스턴스를 파라미터로 받아서 사용함

4. also/let

  • also와 let은 위에서 언급했던 함수들과 동작이 일치한다.
  • it 키워드 사용 가능

생성된 인스턴스 반환 : apply, also
최종 표현식 반환 : run, let

fun main(){
    var price = 1223456
    var a = Book("스프링 짱짱", 12000).apply {
        name = "코틀린" + name
        discount()
    }

     a.run {
         println("타이틀 : ${name}, 가격 : ${price}")
     }
}

class Book(var name: String, var price: Int) {
    fun discount(){
        price-=2000
    }
}
  • 위와 같은 코드를 실행 시 run 스코프에 있는 출력은 a.price가 아닌 상위 스코프에 있는 price가 출력이 된다. 위와 같은 상황을 방지하기 위해 it 키워드를 사용한다.
fun main(){
    var price = 1223456
    var a = Book("스프링 짱짱", 12000).apply {
        name = "코틀린" + name
        discount()
    }

     a.let {
         println("타이틀 : ${it.name}, 가격 : ${it.price}")
     }
}

class Book(var name: String, var price: Int) {
    fun discount(){
        price-=2000
    }
}

출처 : https://www.youtube.com/watch?v=QGDWWL6qA3I

profile
평범한 백엔드 개발자

0개의 댓글