스코프 함수를 이용하면 인스턴스의 속성이나 함수를 scope내에서 깔끔하게 분리하여 사용할 수 있다는 점 때문에 코드의 가독성을 향상시키는 특징이 있다.
이러한 스코프 함수에 대해 자세히 알아보자.
스코프 함수는 함수형 언어의 특징을 좀 더 편리하게 사용할 수 있도록 기본으로 제공하는 함수들이다.
클래스에서 생성한 인스턴스를 스코프 함수에 전달하면 인스턴스의 속성이나 함수를 좀 더 깔끔하게 불러 쓸 수 있다.
스코프 함수에는 apply, run, with, also, let이 있다.
각각에 대해 자세히 알아보자.
apply : 인스턴스를 생성한 후 변수에 담기 전에 ‘초기화 과정을 수행할 때’ 많이 쓰인다.
apply와 같은 스코프 함수를 사용하면 main함수와 ‘별도의 scope’에서 인스턴스의 변수와 함수를 조작하므로 코드가 깔끔해진다는 장점이 있다.
참조연산자를 이용해 속성값을 불러오는 코드는 아래와 같다.
fun main() {
var a = Book("코틀린 문법 ,10000")
a.name = "[특가]" + a.name
a.discount()
}
class Book(var name: String, var price: Int) {
fun discount() {
price -= 2000
}
}
그렇다면 위 코드에 apply를 적용해보자.
fun main() {
var a = Book("코틀린 문법", 10000).apply {
name = "[특가]" + name
discount()
}
}
class Book(var name: String, var price: Int) {
fun discount() {
price -= 2000
}
}
apply를 이용하면 인스턴스를 생성하자마자 그 인스턴스에 참조 연산자를 사용하여 apply를 붙이고 중괄호로 람다 함수를 하나 만들어
apply의 scope안에서 직접 인스턴스의 속성과 함수를 참조연산자 없이 사용이 가능하다.
또한 apply는 인스턴스 자신을 다시 반환하므로 이렇게 생성되자마자 조작된 인스턴스를 변수에 바로 넣어줄 수 있다.
run : apply처럼 run스코프 안에서 참조연산자를 사용하지 않아도 된다는 점은 같지만 일반 람다함수처럼 인스턴스대신 마지막 구문에 결과값을 반환한다는 차이점이 있다.
따라서 이미 인스턴스가 만들어진 후에 인스턴스의 함수나 속성을 scope 내에서 사용해야 할 때 유용하다.
var b = a.run {
println(a.price)
a.name
}
fun main() {
var a = Book("코틀린 문법", 10000).apply {
name = "[특가]" + name
discount()
}
a.run {
print("상품명: ${name}, 가격: ${price}원")
}
}
class Book(var name: String, var price: Int) {
fun discount() {
price -= 2000
}
}
var b = a.run {
println(a.price)
a.name
}
이렇게 쓰면 가격은 출력하지만 마지막 구문인 이름은 반환하여 b라는 변수에 할당된다.
with : run과 동일한 기능을 가지지만 단지 인스턴스를 참조연산자 대신 패러미터로 받는다는 차이가 있다.
a.run{…}
with(a){…}
also와 let은 각각 apply와 run과 같은 역할을 한다.
다만 한가지 공통적인 차이점이 있다.
apply와 run 이 참조 연산자 없이 인스턴스의 변수와 함수를 사용할 수 있었다면
also와 let은 마치 패러미터로 인스턴스를 넘긴 것처럼 it을 통해서 인스턴스를 사용한다.
그렇다면 왜 굳이 패러미터를 통해서 인스턴스를 사용하는 과정을 거칠까?
바로 같은 이름의 변수나 함수가 ‘scope 바깥에 중복’되어 있는 경우에 혼란을 방지하기 위해서이다.
run함수가 인스턴스내의 속성보다 run이 속해있는 main함수의 변수를 더 우선시한다 -> 이럴경우 run을 대체해 let을 사용하고 it 활용한다
(name-> it.name, price -> it.price))
apply역시 같은 경우가 있다면 also로 대체한다.
apply / also : 처리가 끝나면 인스턴스 반환
run / let : 처리가 끝나면 최종값 반환
위 이미지는 공식 문서에 첨부된 표로 각 스코프 함수에서의 참조 방법과 리턴 타입 등에 대해 설명되어 있다.
스코프 함수 공식문서 확인하러 가기
'Kotlin' 카테고리의 다른 글
[Kotlin] lateinit와 by lazy 비교 (2) | 2023.11.20 |
---|---|
[Kotlin] 코루틴(coroutine)(2) - 코루틴 사용 방법 (0) | 2023.11.15 |
[Kotlin] 코루틴(coroutine)(1) - 코루틴 무엇인가 (2) | 2023.10.09 |
[Kotlin] 익명객체와 옵저버 패턴 (0) | 2023.09.05 |
[Kotlin] 고차함수와 람다함수 (0) | 2023.08.16 |