1. 코틀린에서의 익명 함수와 람다 표현식
문법 차이
- 람다 표현식:
- 중괄호
{}
안에 파라미터와 본문을 작성하며, 파라미터와 본문은->
기호로 구분한다. - 예시:
{ x: Int -> x * 2 }
- 중괄호
- 익명 함수:
fun
키워드를 사용하여 이름 없이 정의하며, 일반 함수와 동일한 문법을 따른다.- 예시:
fun(x: Int): Int { return x * 2 }
메모리에서의 동작 원리
- 람다 표현식:
- 외부 변수를 참조하면 클로저(closure)가 생성된다.
- 클로저는 캡쳐된 변수들을 함께 보관하며, 이 변수들은 힙 메모리에 할당된다.
- 만약 외부 변수를 캡쳐하지 않는다면, 컴파일러는 인라인이나 싱글톤 형태로 최적화하여 불필요한 객체 생성을 줄인다.
- 외부 변수를 참조하면 클로저(closure)가 생성된다.
- 익명 함수:
- 익명 함수도 외부 변수를 참조하면 클로저가 생성될 수 있다.
- 그러나 문법이 일반 함수와 유사하므로, 캡쳐하지 않는 경우 컴파일러가 정적 메서드로 변환하거나 인라인화하여 힙 메모리 할당을 최소화할 수 있다.
- 람다와 달리 익명 함수는 내부에서 사용하는
return
이 자신에게 국한되어 처리된다.
2. 코틀린과 자바에서의 차이
코틀린
- 코틀린은 함수형 프로그래밍에 최적화되어 있어, 익명 함수와 람다 모두 인라인 최적화 기법을 활용할 수 있다.
- 캡쳐하지 않으면 컴파일러가 불필요한 객체 생성을 피하기 위해 인라인이나 싱글톤 형태로 최적화한다.
- 문법상의 차이로
return
처리 방식에서만 차이가 존재하며, 메모리 관리 측면에서는 상황에 따라 비슷하게 최적화한다.
자바
- 자바 8부터 도입된 람다는 런타임 시
invokedynamic
매커니즘을 통해 동적으로 처리된다. - 람다는 갭쳐된 경우에도 최적화되어 재사용된 가능한 객체를 생성하거나, 람다 메타 팩토리(lambda metafactory)를 통해 메모리 할당을 줄인다.
- 익명 내부 클래스(익명 함수)는 무조건 매번 새로운 객체가 생성된다.
반응형
'Kotlin' 카테고리의 다른 글
[Kotlin in Action] 8.3 고차 함수 안에서 흐름 제어 (0) | 2025.04.02 |
---|---|
[Kotlin in Action] 8.2 인라인 함수: 람다의 부가 비용 없애기 (0) | 2025.04.02 |
[Kotlin] object는 어떻게 자바로 디컴파일 되는가 (0) | 2025.03.27 |
[Kotlin in Action] 8.1 고차 함수 정의 (0) | 2025.03.27 |
[Kotlin in Action] 7.5 프로퍼티 접근자 로직 재활용: 위임 프로퍼티 (0) | 2025.03.27 |
댓글