익명 함수로, 함수의 본문을 간단하게 표현할 수 있게 해주는 기능
한 줄 짜리 함수를 표현하거나, 고차 함수의 인자로 전달할 때 사용
예시)
val sum = { a: Int, b: Int -> a + b }
println(sum(1, 2)) // 3
함수를 매개변수로 받거나, 함수를 반환하는 함수
예시) operate 내부에서 인자로 받은 operation 함수에 인자로 a와 b를 집어넣어 표현한 고차 함수
fun operate(a: Int, b: Int, operation: (Int, Int) -> Int): Int {
return operation(a, b)
}
val result = operate(5, 3, { x, y -> x * y })
println(result) // 15
스코프 함수는 객체를 컨텍스트 내에서 처리하는 기능을 가진 함수들로, 코드 가독성을 높이고 중복을 줄이는 역할을 하는 함수들이다.
람다 표현식과 함께 사용하는 친구들이라 람다와 함께 묶어서 정리하면 좋을 듯 하다.
각 함수들은 this/it을 사용하는 방식 등의 차이가 있어 때에 따라 선택하면 된다.
예시를 위해 같은 객체를 여러가지 스코프 함수들로 표현해 보았다!
data class Person(var name: String, var age: Int, var city: String)
val person = Person("Alice", 25, "Seoul")
it 키워드를 사용하고, 람다 식의 결과값 반환을 반환한다.
주로 null-safe 작업에 사용
val nameLength = person.let {
println("Name: ${it.name}, Age: ${it.age}") // Name: Alice, Age: 25
it.name.length // 반환값
}
println("Name length: $nameLength") // Name length: 5
주로 초기화 코드나 여러 작업을 수행하고 마지막 결과를 반환할 때 사용한다.
val greetingMessage = person.run {
println("Name: $name, Age: $age, City: $city") // Name: Alice, Age: 25, City: Seoul
"Hello, my name is $name and I am $age years old." // Hello, my name is Alice and I am 25 years old.
}
run과 거의 동일하지만, 파라미터로 객체를 받아 스코프 함수를 사용한다. 역시 마지막 결과를 반환한다.
val greetingMessage = with(person) { // run 예시와 이 부분만 다름
println("Name: $name, Age: $age, City: $city") // Name: Alice, Age: 25, City: Seoul
"Hello, my name is $name and I am $age years old." // Hello, my name is Alice and I am 25 years old.
}
주로 객체를 설정, 초기화 할때 사용하고, 객체 자체를 반환한다.
val updatedPerson = person.apply {
name = "Bob"
age = 30
city = "Busan"
}
println(updatedPerson) // Person(name=Bob, age=30, city=Busan)
주로 부수적인 작업을 수행할 때 사용하고, 객체 자체를 반환한다. it 키워드를 사용한다.
val personWithLog = person.also {
println("Before updating: $it") // Before updating: Person(name=Bob, age=30, city=Busan)
}.apply {
name = "Charlie"
age = 28
city = "Incheon"
}.also {
println("After updating: $it") // After updating: Person(name=Charlie, age=28, city=Incheon)
}
println(personWithLog) // Person(name=Charlie, age=28, city=Incheon)
also와 apply는 객체 자체를 반환하기 때문에, 이렇게 연속해서 사용할수도 있다.
it 키워드 사용하고 싶다면 -> let, also
람다식의 결과값을 사용하고 싶다면 -> let, run, with
인스턴스 자체를 사용하고 싶다면 -> apply, also
it 키워드를 사용하면서 반환값으로 인스턴스 자체를 받고싶다면 also를 사용하고,
it 키워드를 사용하면서 반환값으로 람다식의 결과값을 사용하고 싶다면 let을 사용한다던지 하는 식으로 상황에 맞게 사용하면 된다.