ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] 스코프 함수 (Scope Function)
    코틀린 공부/코틀린 기초 2024. 5. 23. 10:30

    코틀린은 스코프 함수 라는 것을 제공한다.

     

    스코프 함수는 특정 객체의 특정 동작 (프로퍼티 초기화, 활용 등)을 실행하기 위한 목적만을 가진 함수다.

     

    스코프 함수를 람다 함수로 사용하게 되면 임시로 Scope를 형성하는데, 이 Scope 내에데 객체의 이름을 일일이 참조할 필요 없이 객체를 접근하고 핸들링할 수 있다는 편리하다는 장점이 있다. 

     

    코틀린에서 제공하는 스코프 함수는 5가지다.

    • apply, run, with, also, let

    1. apply

    • apply 함수는 인스턴스를 새로 생성하고 특정 변수에 할당하기 전에 초기화 작업을 해줄수 있는 스코프를 만들어줌
    • apply 함수 내에 모든 명령이 수행되고 나면 명령들이 적용되어 새로 생성된 인스턴스를 반환한다는 특징을 갖는다. 
    data class ScopeFunctionBook(var name: String, var price: Int) {
        fun discount(){
            price -= 2000
        }
    }
    
    // 1. apply는 인스턴스를 생성한 후 변수에 담기전에 '초기화 과정'을 수행할때 쓰인다.
    val book1 = ScopeFunctionBook("BookA", 30000).apply {
        name = "초특가 $name"
        discount()
    }
    println(book1)
    
    // 결과 : ScopeFunctionBook(name=초특가 BookA, price=28000)

    2. run

    • run은 apply와는 다르게 반환하는 값은 스코프 내 명령 실행 결과 값이다.
    • 이미 만들어진 인스턴스 값 혹은 특정 계산 결과를 필요로 하는 경우, run을 활용해 이를 반환받아볼 수 있다. 
    val book1 = ScopeFunctionBook("BookA", 30000).apply {
        name = "초특가 $name"
        discount()
    }
    
    val value = book1.run {
        price
    }
    
    println("책의 가격 : $value")
    
    // 결과 : 책의 가격 : 26000

     

    3. with

    • with와 run은 사용 방식이 조금 다를뿐 거의 같다. 
    val value2 = with(book1){
        price
    }
    println("책의 가격 : $value2")
    

     

    run과 with의 차이점

    • with는 일반함수로 parameter로 직접 객체를 받는다
    • run은 확장함수로 사용하며, Safe Call을 통해 non-null인지를 체크하고 실행할 수 있다. 
    val value = book1?.run {
        price
    }
    val value2 = with(book1){
        price
    }

    4. also

    • apply와 유사하지만 프로퍼티를 바로 호출하지 않고 it을 거쳐서 호출한다. 
    val book2 = ScopeFunctionBook("BookA", 30000).also {
        it.name = "초특가 ${it.name}"
        it.discount()
    }

    5. let

    • run과 유사하지만 let 역시 프로퍼티를 바로 호출하지 않소 it을 거쳐서 호출한다. 
    book1.let {
        println("상품명: ${it.name}, 가격 ${it.price}원") // 결과 : 상품명: BookA 개정판, 가격 26000원
    }

     

    also & let은 각각 apply & run가 거의 유사하고 단지 프로퍼티를 바로 호출할지 it을 거쳐서 호출할지 정도의 차이다.

     

    이렇게 사용하는 이유는 같은 이름의 변수나 함수가 scope 바깥에 중복 되어 있는 경우 혼란을 방지 하기 위해서 사용한다고 한다. 

Designed by Tistory.