
람다는 익명 함수를 표현하기 위해 사용하는 문법입니다. 이를 활용하여 메서드 자체를 메서드의 매개변수로 전달할 수 있습니다.
Java는 함수를 2급시민으로 취급합니다. 즉, 변수에 직접 할당하거나 파라미터로 전달할 수 없습니다. 그렇기 때문에 아래와 같이 함수형 인터페이스를 활용해야 합니다.

함수형 인터페이스 종류
- Predicate<T> : 조건 검사 (true/false 반환)
- Function<T,R> : 입력 → 출력 변환
- Consumer<T> : 입력 소비 (리턴 없음)
- Supplier<T> : 값 제공 (입력 없음)
Kotlin에서는 함수를 1급시민으로 취급합니다. 즉, 함수 자체를 변수에 할당하거나 파라미터로 전달할 수 있고, 별도의 함수형 인터페이스가 필요하지 않습니다. 함수형 인터페이스를 활용해 전달받는 Java와 달리 아래와 같이 파라미터 타입과 반환 타입을 통해 전달받을 수 있습니다.

이는 아래와 같이 변수에 할당하지 않고 바로 선언하는 형태로 변형될 수 있습니다.

중괄호와 화살표를 활용하는 형태의 함수의 경우 함수를 받는 파라미터가 마지막에 위치해 있다면 다음과 같은 형태도 가능합니다.

파라미터에 들어가야 할 파라미터 타입 추론도 가능하기 때문에 타입 생략이 가능하고, Kotlin에서는 파라미터가 1개인 경우 It 키워드를 사용하여 다음과 같이 형태로도 변형할 수 있습니다.

Closure는 람다가 실행되는 시점에 사용하고 있는 외부 변수를 포획하여, 해당 변수가 원래의 스코프를 벗어난 이후에도 계속 접근할 수 있도록 만들어주는 개념입니다.
Java는 final 혹은 effectively final(사실상 값이 변하지 않는) 변수만 캡처할 수 있습니다. 아래와 같이 변경되는 외부 변수는 람다 표현식 내부에서 사용 불가합니다.

Kotlin은 Java와 달리 외부 변수를 자유롭게 캡처할 수 있고, 심지어 값 변경도 가능합니다. 아래와 같이 변경되는 외부 변수도 람다 표현식 내부에서 사용 가능합니다.
