특정 범위(객체 컨텍스트) 내에서 코드 블록을 실행하는 여러 함수를 Scope function이라고 부름
fun main() {
persons[0].let {
println(it)
println("첫번째 사람의 나이 : ${it.age}")
}
with(persons[1]) {
println(age)
println(name)
}
}
Kotlin
복사
•
특정한 객체를 영역을 한정하여 활용하고 싶은 경우 주로 사용
◦
장점 : 반복적인 코드를 줄이고, 코드의 응집도를 올릴 수 있음
◦
단점 : 과도하게(중첩되게) 사용하거나 코틀린에 익숙하지 않을 경우 코드를 읽기 어려움
Scope function의 종류
•
Scope function은 특정 객체를 영역을 한정하는데 활용하며 크게 아래의 두 가지 방법으로 구분 가능
◦
수신 객체를 어떻게 받아오느냐 (람다 식(it) or 객체 자체(this))
◦
응답을 어떻게 주느냐 (수신한 식의 결과 or 객체 자체)
다양한 Scope function 사용 예시
package ch17
val persons = listOf(
Person("Captain", 44),
Person("Cyclops", 35),
Person("Deadpool", 31),
Person("Iceman", 54),
Person("Loki", 54),
Person("Hulk", 54),
)
fun main() {
// 특정 값에 대해 사용 영역을 명확히 하기 위해 사용
// 객체 참조 : this
// 응답 : 람다식 결과
with(persons[1]) {
println(age)
println(name)
}
// 객체의 값을 한번에 여러개 설정하는 경우
// 객체 참조 : this
// 응답 : 객체 자신
val personTwo = persons[2].apply {
this.name = "newName"
this.age = 72
}
// nullable한 값을 확인하여 not null인 경우 실행하는데 주로 사용
// 객체 참조 : it
// 응답 : 람다식 결과
persons.find { it.age > 60 }?.let {
println("=======나이 60이 넘는 사람 리 스트=========")
println(it)
println("====================================")
}
// 추가적인 효과를 적용하기 위해 주로 사용
// 객체 참조 : it
// 응답 : 객체 자신
persons.also {
if (it.size < 5) throw IllegalStateException("persons의 크기가 너무 적음")
println("persons를 모두 완성했다 이젠 뭐하지?")
}
// 객체의 값 설정, 추가적인 연산 진행에 사용
// 객체 참조 : this
// 응답 : 람다식 결과
persons.run {
println(this.map { "${it.name}'s age: ${it.age}" })
println(this.map { "${it.name}의 나이는 ${it.age}살" })
}
}
== 결과 ==
35
Cyclops
=======나이 60이 넘는 사람 리 스트=========
Person(name=newName, age=72)
====================================
persons를 모두 완성했다 이젠 뭐하지?
[Captain's age: 44, Cyclops's age: 35, newName's age: 72, Iceman's age: 54, Loki's age: 54, Hulk's age: 54]
[Captain의 나이는 44살, Cyclops의 나이는 35살, newName의 나이는 72살, Iceman의 나이는 54살, Loki의 나이는 54살, Hulk의 나이는 54살]
Kotlin
복사
•
이름은 다르나 내부적으로 보면 같은 용도로 사용할 수 있는 함수들이 있음
•
각각의 이름과 만든 목적에 따라 사용하는 것이 좋음
•
참고