KOTLIN

[KOTLIN] Scope 함수

집한구석 2022. 5. 18. 17:21
728x90

Scope 함수

  • 특정 객체의 컨텍스트(Object Context) 내에서 특정 동작을 실행하기 위한 목적만을 가진 함수
  • Scope 함수를 람다로 사용하게 되면 임시로 Scope를 형성하는데 해당 Scope내에서 객체의 이름을 일일히 참조할 필요 없이 객체를 접근하고 핸들링할 수 있음
  • let / run / with / apply / also 총 5가지 함수가 있으며, 기본적으로 객체에 붙어 있는 코드 블록을 실행함

Apply

fun main() {
    val book = Book("코틀린 책", 10000).apply {
        //apply scope안에서 직접 인스턴스의 속성과 함수를 사용함
        name = "특가 " + name
        discount()
    }
    println("${book.name}은 가격 : ${book.price}입니다.")
}

class Book(var name: String, var price: Int) {
    fun discount() {
        price -= 2000
    }
}
  • 인스턴스를 생성 후 변수에 담기 전 초기화 과정을 수행할 때 사용
  • 참조연산자 없이 인스턴스의 속성과 함수를 사용할 수 있음
  • 인스턴스 자신을 반환 해주기 때문에 변수에 넣어줄 수 있음

Run

fun main() {
    val book = Book("코틀린 책", 10000).apply {
        //apply scope안에서 직접 인스턴스의 속성과 함수를 사용함
        name = "특가 " + name
        discount()
    }
    book.run {
        //인스턴스의 속성을 직접사용함
        println("${name}은 가격 : ${price}입니다.")
    }
}

class Book(var name: String, var price: Int) {
    fun discount() {
        price -= 2000
    }
}
  • 인스턴스의 함수나 속성을 scope내에서 사용해야할 때 사용
  • apply 처럼 참조연산자를 사용하지 않아도 됨
  • 일반 람다함수처럼 인스턴스를 반환하는게 아니라 마지막 구문의 결과값을 return함

With

fun main() {
    val book = Book("코틀린 책", 10000).apply {
        //apply scope안에서 직접 인스턴스의 속성과 함수를 사용함
        name = "특가 " + name
        discount()
    }
    with(book) {
        //book을 파라미터로 받음
        println("${name}은 가격 : ${price}입니다.")
    }
}

class Book(var name: String, var price: Int) {
    fun discount() {
        price -= 2000
    }
}
  • Run과 다르게 인스턴스를 참조연산자 대신 파라미터로 전달받음

Also / let

fun main() {
    //외부 스코프에 중복된 price가 존재함
    val price = 5000
    val book = Book("코틀린 책", 10000).apply {
        name = "특가 " + name
        discount()
    }
    //it으로 중복 막아줌
    book.let {
        println("${it.name}은 가격 : ${it.price}입니다.")
    }
}

class Book(var name: String, var price: Int) {
    fun discount() {
        price -= 2000
    }
}
  • apply랑 같은 용도(처리가 끝나면 인스턴스를 반환)는 also로 run 이랑 같은 용도(처리가 끝나면 최종값 반환)로 let을 사용
  • 마치 파라미터로 인스턴스를 넘긴것처럼 it을 통해서 사용해야함
  • 파라미터 사용하는 이유는 같은 이름의 변수 혹은 함수가 scope 밖에 중복되어 있는 경우 혼란을 방지하기 위해 사용

Scope 사용하는 이유

  • 인스턴스의 속성이나 함수를 Scope 내에서 깔끔하게 분리하여 사용할 수 있다는 점 때문에 코드의 가독성을 높여줌 (유지보수가 더 쉬워짐?)

'KOTLIN' 카테고리의 다른 글

[KOTLIN] 시퀀스 (SEQUENCES)  (0) 2022.05.22
[KOTLIN] 확장함수  (0) 2022.05.22
[KOTLIN] 컬렉션  (0) 2022.05.18
[KOTLIN] OPEN 키워드  (0) 2022.05.10
[KOTLIN] DATA CLASS  (0) 2022.05.07