안녕하세요.
오늘은 Scope Function에 대해서 알아보도록 하겠습니다.
정리
오늘 다룰 Scope Function은 총 5가지로,
각 함수에 대해 간단하게 정리부터 하고 시작하겠습니다.
Scope Function | 참조 방법 | Return Type |
let | it | Lambda Result |
run | this | Lambda Result |
with | this | Lambda Result |
apply | this | Context Object |
also | it | Context Object |
let
권장 사용 시점
- nullable 타입을 처리할 때
- 임시 변수를 줄이고, 체이닝을 통해 코드의 가독성을 높일 때
- 부수적인 작업을 수행한 후 객체를 반환하지 않을 때
장점
- null 안정성을 간단하게 구현할 수 있다
Before
val input: String? = getInput()
if (input != null) {
println(input.length)
}
After
val input: String? = getInput()
input?.let {
println(it.length)
}
run
권장 사용 시점
- 멤버 접근과 함수 호출을 함께 실행해야 할 때
장점
- 객체의 멤버와 함수를 한 블록 안에서 간결하게 처리할 수 있다
Before
val config = getConfig()
if (config.isValid()) {
initialize(config)
}
After
val config = getConfig().run {
if (isValid()) {
initialize(this)
}
}
with
권장 사용 시점
- 객체에 여러 번 접근해야 할 때
장점
- 객체에 여러 번 접근할 때 코드가 간결해지고 가독성이 좋아진다
Before
val builder = StringBuilder()
builder.append("Hello")
builder.append(", ")
builder.append("World!")
val result = builder.toString()
After
val result = with(StringBuilder()) {
append("Hello")
append(", ")
append("World!")
toString()
}
apply
권장 사용 시점
- 객체를 초기화 하면서, 해당 객체를 반환해야 할 때
장점
- 객체를 설정하는 과정을 간결하게 작성할 수 있다
- property에 따른 여러 부 생성자를 만들지 않아도 된다
Before
val person = Person()
person.name = "Kang"
person.age = 20
person.address = "Gumi"
After
val person = Person().apply {
name = "Kang"
age = 20
address = "Gumi"
}
also
권장 사용 시점
- 부수적인 작업 (로그 출력, 디버깅 등) 을 수행할 때
장점
- 객체의 값을 변경하지 않으면서도 부수적인 작업을 추가할 수 있다
- 해당 객체를 반환하여 체이닝을 계속할 수 있다
Before
val numbers = mutableListOf(1, 2, 3)
println("Adding to 4 to the list")
numbers.add(4)
After
val numbers = mutableListOf(1, 2, 3).also {
println("Adding to 4 to the list")
}.apply {
add(4)
}
'Kotlin' 카테고리의 다른 글
[Kotlin] SAM & invoke (1) | 2024.10.30 |
---|---|
[Kotlin] 함수형 프로그래밍 (2) | 2024.10.29 |
[Kotlin] Sealed Class (3) | 2024.09.22 |
[Kotlin] Extension Function (확장 함수) (0) | 2024.09.10 |
[Kotlin] Null Safety (0) | 2024.07.29 |