728x90
반응형
✅ 코틀린의 Scope Function이란?
- 코틀린 표준 라이브러리에서 제공하는 확장함수
- 목적 : 간결성, 명료성, 유지보수 용이성
- 정의 : 객체의 컨텍스트 내에서, 실행 가능한 코드 블럭을 만드는 함수
- 종류 : let, run, apply, also, with
- 람다식이 제공된 객체에 범위 지정 함수를 호출할 경우 임시 범위가 생성되며, 이 범위에서 이름 없이 객체에 접근이 가능하다.
- 다섯가지 범위 지정 함수의 차이점
- 수신 객체 접근 방법의 차이 : this와 it
- Return 값 : 수신객체 자체인지, 마지막 행인지(lambda result)
- 다섯가지 범위 지정 함수를 각 함수의 특징에 맞게 사용하는 것이 좋다.
- 수신 객체(Receiver) : 확장 함수가 호출되는 대상이 되는 값(객체)
- 수신 객체 지정 람다(Lambda with Receiver) : 수신 객체를 명시하지 않고, 람다의 본문 안에서 해당 객체의 메서드를 호출할 수 있게 하는 것
- 각 함수의 예시와 결과를 보기 위해 먼저 User Class를 선언해준다.
class User(
val name: String,
val age: Int,
var gender: Boolean, // var로 선언해줘야 범위 지정 함수 내에서 값을 변경할 수 있다.
var hasGlasses: Boolean = true // 디폴트 값
)
📌 let 함수
- let의 경우 let 함수를 호출하는 수신자 객체를 블록의 인자로 넘기며, 블록의 결과값을 반환한다.
- 주로 null 체크를 해야할 때나 지역 변수를 명시적으로 표현 해야할 때 사용한다.
- it사용 | 람다 식의 마지막 행 리턴
fun main() {
val user = User("dahoon", 26, true)
val age = user.let {
user.age
}
println(age)
val result = user.let {
it.age
it.gender
}
println(result)
}
- 예제에서 확인할 수 있듯이 result의 결과 값으로 gender 값이 return 된 것을 확인할 수 있다.
- 또한 it 대신에 명시적인 사용이 가능하다.
📌 run 함수
- 주로 어떤 값에 대해 계산이 필요한 경우나, 객체를 초기화할 때 사용한다.
- this 사용 | 람다식의 마지막 행 리턴
fun main() {
val user = User("dahoon", 26, true)
val name1 = user.run {
user.name
}
val name2 = user.run {
this.name
}
val name3 = user.run {
name
gender
}
println("name1 : $name1 / name2 : $name2 / name3 : $name3")
}
- this의 경우 this 그대로 사용할 수도, 명시하여 사용할 수도 생략하여 사용할 수도 있다.
- let과 마찬가지로 마지막 행을 return 하는 것을 볼 수 있다.
📌 apply 함수
- 람다에 작성된 코드를 수신자 객체에 적용하는 함수라고 생각하면 된다.
- 주로 객체를 초기화할 때 사용한다.
- this 사용 | 수신객체 리턴
fun main() {
val user = User("dahoon", 26, true)
val gender1 = user.apply {
gender
println(gender)
}
println("$gender1 // ${gender1.gender}")
val gender2 = user.apply {
gender = false
println(gender)
}
println("$gender2 // ${gender2.gender}")
}
- return 값이 수신객체 자기 자신이기 때문에 gender1과 gender2를 그대로 출력하게 되면 객체에 대한 정보가 출력되는 것을 알 수 있다.
- 따라서 객체의 값에 접근하기 위해서 .프로퍼티를 통해 접근한다.
📌 also 함수
- 주로 수신객체를 명시적으로 사용하고 싶을 때나 로그를 남길 때 사용한다.
- it 사용 | 수신객체 리턴
fun main() {
val user = User("dahoon", 26, true)
val hasGlasses1 = user.also {
println(it.hasGlasses)
user.name
user.hasGlasses = false
println(it.hasGlasses)
}
println("$hasGlasses1 // ${hasGlasses1.hasGlasses}")
}
- let 함수처럼 it을 사용하기 때문에 it 또는 user와 같은 명시적인 선언을 해줘야 한다.
- 마찬가지로 print문을 보면 수신객체 자신을 return하는 것을 확인할 수 있다.
📌 with 함수
- 주로 객체를 초기화하거나, 람다 리턴 값이 필요 없을 때 사용한다.
- 람다 식의 마지막 행 리턴
fun main() {
val user = User("dahoon", 26, true)
val result1 = with(user) {
hasGlasses = false
hasGlasses // 만약 6번째 줄이 없는 경우 kotlin.Unit을 리턴함
}
println(result1)
val result2 = with(user) {
hasGlasses = false
true
"hello" // 마지막 줄을 리턴
}
println(result2)
}
- 결과를 보면 람다 식의 마지막 값이 return된 것을 확인할 수 있다.
728x90
반응형
'Studying > Kotlin' 카테고리의 다른 글
[Kotlin In Action] 4장. 클래스, 객체, 인터페이스(4) - object 키워드 : 클래스 선언과 인스턴스 생성 (0) | 2023.05.16 |
---|---|
[Kotlin In Action] 4장. 클래스, 객체, 인터페이스(3) - 컴파일러가 생성한 메서드 : 데이터 클래스와 클래스 위임 (0) | 2023.05.16 |
[Kotlin In Action] 4장. 클래스, 객체, 인터페이스(2) - 뻔하지 않은 생성자와 프로퍼티를 갖는 클래스 선언 (2) | 2023.05.11 |
[Kotlin In Action] 4장. 클래스, 객체, 인터페이스(1) - 클래스 계층 정의 (0) | 2023.05.09 |
[Kotlin In Action] 3장. 함수 정의와 호출(5) - 로컬 함수와 확장 (0) | 2023.05.08 |