[20241114 스터디] Kotlin - 고차 함수

김방토·2024년 11월 13일
0

Android

목록 보기
1/10

람다 (Lambda)

익명 함수로, 함수의 본문을 간단하게 표현할 수 있게 해주는 기능
한 줄 짜리 함수를 표현하거나, 고차 함수의 인자로 전달할 때 사용

예시)

val sum = { a: Int, b: Int -> a + b }
println(sum(1, 2))  // 3

고차 함수 (Higher-Order Function)

함수를 매개변수로 받거나, 함수를 반환하는 함수

예시) 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")

let

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

run

주로 초기화 코드나 여러 작업을 수행하고 마지막 결과를 반환할 때 사용한다.

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.
}

with

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.
}

apply

주로 객체를 설정, 초기화 할때 사용하고, 객체 자체를 반환한다.

val updatedPerson = person.apply {
    name = "Bob"
    age = 30
    city = "Busan"
}

println(updatedPerson) // Person(name=Bob, age=30, city=Busan)

also

주로 부수적인 작업을 수행할 때 사용하고, 객체 자체를 반환한다. 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을 사용한다던지 하는 식으로 상황에 맞게 사용하면 된다.

profile
🍅 준비된 안드로이드 개발자 📱

0개의 댓글