이 포스트는 아래의 Android 공식 홈페이지에서 제공하는 Codelab을 기반으로 작성되었습니다.
https://developer.android.com/codelabs/basic-android-kotlin-compose-generics?hl=ko#0
범위 함수(Scope 함수)를 사용하면 변수 이름에 반복적으로 접근하지 않고도 클래스의 속성과 메소드에 간결하게 접근할 수 있다.
범위 함수는 객체의 이름을 참조하지 않고 객체의 속성 및 메소드에 액세스할 수 있도록 하는 고차 함수이다.
왜 범위 함수인가?
-> 전달된 함수의 본문(body)에 범위 함수가 호출되는 객체의 범위가 포함되기 때문
범위 함수를 활용하면 마치 함수가 클래스의 메소드로 정의된 것처럼 해당 클래스의 속성과 메소드에 접근할 수 있다.
-> 코드에 객체 이름 중복을 생략하면서 가독성이 높아진다.
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() 함수는 객체에서 호출할 수 있으며 변수에 저장될 수 있도록 해당 객체에 대한 참조를 반환한다.
val quiz = Quiz().apply {
printQuiz()
}
// apply() 함수는 Quiz 클래스의 인스턴스를 반환한다.
// 이 경우에는 해당 인스턴스를 사용하지 않으므로 아래와 같이 변경할 수 있다.
Quiz().apply {
printQuiz()
}