[Kotlin] Lambda

Hood·2024년 9월 6일

Kotlin

목록 보기
7/18
post-thumbnail

✍  코틀린과 친해지자

PS문제를 하나씩 풀다보니 공부가 필요한 문법에 대해서 정리한 글입니다.


🔎 람다란?

람다(lambda)를 정의하면 익명함수를 지칭하는 용어이며
실무적으로는 코드를 간결하게 만들고, 지연 연산으로 성능을 높이는 역할을 합니다.
흔히 사용하는 숏코딩에 람다식이 많이 사용됩니다.

람다식은 주로 고차함수!

람다와 친해지기 위해서는 고차함수의 개념을 이해해야 합니다.

먼저 코틀린의 함수는 일급 함수(first-class) 입니다.
일급함수는 프로그래밍 언어가 다른 값과 동등하게 취급하는 것을 의미합니다.
그렇기에 고차 함수는 함수의 매개변수로 사용하거나 함수를 반환하는 함수입니다.
이와 같은 조건에 부합하기 위해 일급 객채여야 합니다.
간단히 설명하면 함수를 변수나 자료구조에 담아낼 수 있고,
파라미터로 다른 함수로 전달하거나 함수로 리턴할 수 있습니다.

일급객체 ?
다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체

일급 객체의 조건

  • 함수의 인자로 전달 가능
  • 함수의 반환값으로 사용 가능
  • 변수에 담을 수 있음

예를 들어보면

fun main() {
    // 함수를 변수로 저장
    val apple = { fruit : String -> println("fruit : $fruit") }
    apple.invoke("apple")

    // 함수를 파라미터로 전달
    val bucket = listOf("apple", "banana", "strawberry", "watermelon").fold("tomato")
    { acc: String, next: String -> "$acc, $next"}.also { println(it) }
}

위 예제 처럼 변수 안에 함수를 저장할 수 있고, 함수를 파라미터로 전달하는 것처럼
람다의 활용성은 무궁무진합니다.
여기서 invoke() 는 특별한 함수, 정확히는 연산자 이며
이름 없이 실행 될 수 있다. 자세한 내용은 포스트로 다뤄보겠습니다.

람다를 왜 사용할까?

람다를 사용하는 이유는 위에서도 설명했듯이
1. 실무적으로 코드를 간결하게 만들 수 있습니다. 그렇다는 건
2. 연산 속도가 빨라져 코드의 성능을 높일 수 있고
3. 반복적인 코드의 불필요한 부분을 제거할 수 있습니다.
그렇기에 전반적인 코드의 가독성도 올라가고 그것은 곧 생상성이 좋아진다는 것입니다.


람다 표기법

코틀린의 람다 표기법을 알아봅시다.

  • 소괄호로 묶은 파라미터와 리턴으로 이루어지며, 화살표 표기법으로 연관 지어준다.
// 매개변수 없음
() -> A

// 매개변수 없음
(A, B) -> C
  • 파라미터의 타입은 생략이 가능하지만, 리턴할 수 없다.
//생략 전
(a: Int, b: Int) -> Int

//생략 후
(a, b) -> Int 

//생략 불가능
(a, b) ->
  • 함수가 마지막 파라미터 면, 블록을 밖으로 보낼 수 있다.
//block이 마지막 파리마터가 아닐 때
fun greeting(block: (String) -> Any, value: String){
    block(value)
}

//block이 마지막 파라미터 일 때
fun greeting(value: String, block: (String) -> Any){
    block(value)
}

fun main() {
    greeting("hello world") { println(it) }
}

// 출력
// hello world

Collection의 람다 활용

람다는 코틀린의 Collection과 활용을 하면 더욱 간결하게 표현이 가능합니다.

예를 들어 collection의 나이 중 최대값을 구하는 코드를 만든다고 치면

class Person(
    val name : String,
    val age : Int,
)

fun main() {
    val billGates = Person("Bill Gates", 30)
    val markZuckerberg = Person("Mark Zuckerberg", 20)
    val elonMusk = Person("Elon Musk", 10)

    val maxAge = listOf(billGates, markZuckerberg, elonMusk).maxOf { person -> person.age }
    println(maxAge)
}

// 출력
// 30

위 예제처럼 간단하게 변수 안에 람다식을 표현하여 간단히 나이를 가져올 수 있습니다.


📌결론

코드의 활용성을 높이기 위해 람다를 알아보았습니다.
숏코딩까지는 아니여도 코드의 성능을 높이기 위해
활용 방법을 많이 알 필요가 있다고 생각했습니다.

참조

profile
달을 향해 쏴라, 빗나가도 별이 될 테니 👊

0개의 댓글