[Kotlin] Kotlin in Action 5장. 람다로 프로그래밍

유콩·2025년 12월 1일
post-thumbnail

🤔람다식이란?
기본적으로 다른 함수에 넘길 수 있는 작은 코드 조각
자바(java 8이전)에서는 함수를 파라미터로 넘기기 위해 무명 내부 클래스를 장황하게 써야했지만, 람다를 사용하면 코드를 데이터처럼 주고받을 수 있게 됨

🤔람다식의 문법
-항상 중괄호 사이에 위치함. 화살표(->)가 인자 목록과 본문을 구분해줌

val sum={x:Int, y:Int->x+y}

🤔람다를 사용하는 이유?
1.간결함:불필요한 코드를 줄이고 핵심 로직만 남김.
2.함수형 프로그래밍: 컬렉션(List,Map)처리를 매우 효율적으로 처리 가능.

// 기존 방식 (함수 선언)
fun sum(x: Int, y: Int): Int {
    return x + y
}

// 람다식 방식
val sumLambda = { x: Int, y: Int -> x + y }

println(sumLambda(10, 20)) // 결과: 30 
// Java 스타일
button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        // 클릭 동작
    }
});

// Kotlin 람다 스타일 (SAM 변환)
button.setOnClickListener { 
    // 클릭 동작 (훨씬 깔끔함)
}

버튼 클릭에 따른 동작을 정의할때, 버튼 클릭 리스너는 onClick이라는 메소드가 들어있는 OnClickListener를 구현해야함.
비슷한 작업을 많이 수행하는 경우 람다를 통해 매개변수를 함수 본문에 작성하여 간결하게 표현 가능.

📣코틀린 람다만의 특징
-후행 람다 (Trailing Lambda): 함수의 마지막 인자가 람다라면, 괄호 () 밖으로 뺄 수 있음.
(코틀린 가독성의 핵심)

후행람다를 사용하지 않은 경우
val sum = numbers.map({ number -> number * 2 })

후행람다를 사용한 경우
val sum = numbers.map { it * 2 }

-it 키워드: 람다 파라미터 이름을 따로 지정하지 않은 경우에는 이름을 생략하고 it으로 지칭할 수 있음.

coins() 함수를 작성할 때 함수의 Int 매개변수에 이름 quantity를 명시적으로 선언함.그러나 매개변수 이름을 완전히 생략할 수 있고 이경우 코틀린은 암시적으로 매개변수에 it 이름을 할당함. 매개변수 이름과 -> 기호를 생략할 수있고 그러면 람다 표현식이 더 간결해짐.

-함수를 반환 유형으로 사용

 // 1. 미리 정의된 작은 함수들 (Name of another function에 해당)
fun sum(a: Int, b: Int): Int = a + b
fun minus(a: Int, b: Int): Int = a - b

// 2. 함수를 반환하는 메인 함수 (이미지의 구조)
//             [함수 이름]            [반환 타입: 함수 그 자체]
fun getOperation(type: String): (Int, Int) -> Int {
    
    if (type == "plus") {
        return ::sum   // 'sum'이라는 함수 자체를 반환 (::는 함수 참조 연산자)
    } else {
        return ::minus // 'minus'라는 함수 자체를 반환
    }
}

fun main() {
    // 사용법
    val selectedFunc = getOperation("plus") // 이제 selectedFunc는 더하기 기능을 가진 함수가 됨
    
    println(selectedFunc(10, 5)) // 결과: 15
}

🙋getOperation 은 15라는 결과값을 주는 게 아니라, 덧셈을 수행할 수 있는 도구를 건네주는 것임

-함수를 다른 함수에 인수로 전달

fun trickOrTreat(isTrick: Boolean, extraTreat: (Int) -> String): () -> Unit{
  if (isTrick) {
        return trick
    } else {
        println(extraTreat(5))
        return treat
    }
}

isTrick : 참거짓을 담는 일반 변수
extraTreat: Int를 던져주면 String 로 바꿔주는 함수
->treatOrTreat 함수는 실행 결과로 입력도 없고 반환값도 없는(:()->Unit) 함수를 만들어내서 돌려줌.

참고자료

https://developer.android.com/codelabs/basic-android-kotlin-compose-function-types-and-lambda?hl=ko#2

0개의 댓글