[Kotlin] 범위 함수(Scope Function)를 사용하여 클래스 속성 및 메소드 접근 (let, apply)

문승연·2023년 7월 31일
0

Kotlin 기본

목록 보기
7/11

이 포스트는 아래의 Android 공식 홈페이지에서 제공하는 Codelab을 기반으로 작성되었습니다.
https://developer.android.com/codelabs/basic-android-kotlin-compose-generics?hl=ko#0

범위 함수(Scope 함수)를 사용하면 변수 이름에 반복적으로 접근하지 않고도 클래스의 속성과 메소드에 간결하게 접근할 수 있다.

범위 함수로 반복 객체 참조 제거

범위 함수객체의 이름을 참조하지 않고 객체의 속성 및 메소드에 액세스할 수 있도록 하는 고차 함수이다.

왜 범위 함수인가?
-> 전달된 함수의 본문(body)에 범위 함수가 호출되는 객체의 범위가 포함되기 때문

범위 함수를 활용하면 마치 함수가 클래스의 메소드로 정의된 것처럼 해당 클래스의 속성과 메소드에 접근할 수 있다.
-> 코드에 객체 이름 중복을 생략하면서 가독성이 높아진다.

let()를 사용하여 긴 객체 이름 바꾸기

let() 함수를 사용하면 객체의 실제 이름 대신 식별자 it을 사용하여 람다 표현식의 객체를 참조할 수 있다.

Before

fun printQuiz() {
    println(question1.questionText)
    println(question1.answer)
    println(question1.difficulty)
    println()
    println(question2.questionText)
    println(question2.answer)
    println(question2.difficulty)
    println()
    println(question3.questionText)
    println(question3.answer)
    println(question3.difficulty)
    println()
}

After

fun printQuiz() {
    question1.let {
        println(it.questionText)
        println(it.answer)
        println(it.difficulty)
    }
    println()
    question2.let {
        println(it.questionText)
        println(it.answer)
        println(it.difficulty)
    }
    println()
    question3.let {
        println(it.questionText)
        println(it.answer)
        println(it.difficulty)
    }
    println()
}

apply()를 사용하여 변수 없이 객체의 메소드 호출

범위 함수는 객체가 변수에 할당되기도 전에 객체에서 호출할 수 있다.
apply() 함수는 객체에서 호출할 수 있으며 변수에 저장될 수 있도록 해당 객체에 대한 참조를 반환한다.

val quiz = Quiz().apply {
    printQuiz()
}

// apply() 함수는 Quiz 클래스의 인스턴스를 반환한다.
// 이 경우에는 해당 인스턴스를 사용하지 않으므로 아래와 같이 변경할 수 있다.

Quiz().apply {
    printQuiz()
}
profile
"비몽(Bemong)"이라는 앱을 개발 및 운영 중인 안드로이드 개발자입니다.

0개의 댓글