Kotlin/Kotlin Language

[Kotlin] 람다 lambda

chattymin 2023. 1. 25. 16:02
728x90
반응형

 

람다는 익명함수 라고도 부른다.

이름은 많이 들어봤는데 람다가 뭘까?

"익명함수"라는 이름이 힌트다. 이름 없이 함수 역할을 하는 형태를 "람다"라고 부른다. 

람다는 화살표 표기법을 사용한다.

 

그럼 어떻게 쓸까?

val lambdaExample: (Int, Int) -> Int = {x: Int, y: Int -> x + y}

자료형 변수명: (선언자료형) {람다식의 매개변수 -> 처리내용}

이러한 형식으로 사용한다.

 

이때 코틀린은 자료형을 추론할 수 있다는 성질로 인해 몇몇가지를 생략할 수 있다.

val lambdaExample: (Int, Int) -> Int = {x: Int, y: Int -> x + y} // 기본형

val lambdaExample = {x: Int, y: Int -> x + y} // 가능

val lambdaExample: (Int, Int) -> Int = {x, y -> x + y} // 가능

val lambdaExample = {x, y -> x + y} // 불가능

2번째와 3번째의 경우에는 하나씩 자료형을 추론할 수 있는 단서를 줬다. 하지만, 마지막 람다식의 경우 자료형을 추론 할 수 있는 정보를 주지 않았기 때문에 불가능하다.

 

람다식을 사용할때 많이들 헷갈리는 부분이 있다. 람다식은 반드시 한줄에 끝내야한다? 아니다. 여러줄을 사용할 수 있다.

단, 람다식이 결과적으로 리턴하는 값은 마지막줄 하나다. 

val lambdaExample: (Int, Int) -> Int = {x, y ->
    x * y
    x / y
    x + y}

fun main(){
    println(lambdaExample(5,5))
}
// 결과값 : 10

위에 아무리 많은 식을 적어두어도 결과로 리턴되는 값은 마지막 줄 하나다. 그럼 이걸 왜 쓰는가.

값을 리턴하는게 아닌 중간 결과를 출력할때도 사용될 수 있다.

val lambdaExample: (Int, Int) -> Int = {x, y ->
    println("hi")
    println("hello")
    x + y}

fun main(){
    println(lambdaExample(5,5))
}
//hi
//hello
//10

예를 들면 이렇게.

 

자 그러면 코틀린과 자바의 차이점은 뭘까?

가장 큰 차이점은 변수에 함수를 넣을수 있는지의 유무이다.

자바에서 함수는 2급 시민이지만, 코틀린에서는 1급 시민이다. 그렇기 때문에 코틀린에서는 변수에 함수를 넣는게 가능하지만, 자바에서는 불가능하다.

 

여기서 람다의 또다른 특징이 있다. 

파라미터가 하나라면, it을 통해 자동으로 추론할 수 있다.

fun main() {
    val str: MutableList<Int> = mutableListOf(1,2,3,-4,5,-8)
    val positive = str.filter { it > 0 }
    println(str)
    println(positive)
}
//[1, 2, 3, -4, 5, -8]
//[1, 2, 3, 5]

여기서는 매개변수가 MutableList내부에 있는 값 하나다. 그렇기 때문에 it이라는 키워드를 사용해서 연산할 수 있다.

 

이거 외에도 람다 사용하는 경우가 많고, 사용법도 많다.

람다는 프로그래밍 언어의 강력한 무기라고 생각한다.

꼭 사용법 익혀셔 코드에 적용시켜보자. 신세계를 경험할거다.

728x90
반응형