본문 바로가기
Kotlin

[Kotlin] 코틀린과 자바에서의 익명 함수와 람다 차이

by Nhahan 2025. 4. 1.

1. 코틀린에서의 익명 함수와 람다 표현식

문법 차이

  • 람다 표현식:
    • 중괄호 {} 안에 파라미터와 본문을 작성하며, 파라미터와 본문은 -> 기호로 구분한다.
    • 예시:
      { x: Int -> x * 2 }
  • 익명 함수:
    • fun 키워드를 사용하여 이름 없이 정의하며, 일반 함수와 동일한 문법을 따른다.
    • 예시:
      fun(x: Int): Int { return x * 2 }

      메모리에서의 동작 원리

  • 람다 표현식:
    • 외부 변수를 참조하면 클로저(closure)가 생성된다.
      • 클로저는 캡쳐된 변수들을 함께 보관하며, 이 변수들은 힙 메모리에 할당된다.
    • 만약 외부 변수를 캡쳐하지 않는다면, 컴파일러는 인라인이나 싱글톤 형태로 최적화하여 불필요한 객체 생성을 줄인다.
  • 익명 함수:
    • 익명 함수도 외부 변수를 참조하면 클로저가 생성될 수 있다.
    • 그러나 문법이 일반 함수와 유사하므로, 캡쳐하지 않는 경우 컴파일러가 정적 메서드로 변환하거나 인라인화하여 힙 메모리 할당을 최소화할 수 있다.
    • 람다와 달리 익명 함수는 내부에서 사용하는 return이 자신에게 국한되어 처리된다.

2. 코틀린과 자바에서의 차이

코틀린

  • 코틀린은 함수형 프로그래밍에 최적화되어 있어, 익명 함수와 람다 모두 인라인 최적화 기법을 활용할 수 있다.
  • 캡쳐하지 않으면 컴파일러가 불필요한 객체 생성을 피하기 위해 인라인이나 싱글톤 형태로 최적화한다.
  • 문법상의 차이로 return 처리 방식에서만 차이가 존재하며, 메모리 관리 측면에서는 상황에 따라 비슷하게 최적화한다.

자바

  • 자바 8부터 도입된 람다는 런타임 시 invokedynamic 매커니즘을 통해 동적으로 처리된다.
  • 람다는 갭쳐된 경우에도 최적화되어 재사용된 가능한 객체를 생성하거나, 람다 메타 팩토리(lambda metafactory)를 통해 메모리 할당을 줄인다.
  • 익명 내부 클래스(익명 함수)는 무조건 매번 새로운 객체가 생성된다.
반응형

댓글