람다와 익명클래스

 

람다와 익명클래스의 this 바인딩은 다르다. 람다의 this는 자신을 둘러싼 인스턴스를 참조하고, 익명클래스는 자기 자신의 인스턴스를 참조한다.

 

익명클래스의 생성과 동작 방식은 컴파일타임에 결정되지만, 람다는 런타임에 실제 호출 시 결정된다(invokedynamic).

 

컴파일타임에서, 익명클래스는 '클래스명$1' 의 형태로 개별 클래스파일이 생성되지만, 람다의 클래스파일이 따로 생성되지 않는다. 이는 람다의 경우 JVM이 클래스파일을 로드하기 위한 동작이 필요치 않음을 의미한다(-Djdk.internal.lambda.dumpProxyClasses=<dir> 을 통해 람다로 생성되는 동적 클래스를 파일로 저장할 수는 있다).

 

런타임에서, 익명클래스는 실행 시 마다 익명클래스의 인스턴스를 생성하는 과정을 거친다. 람다는 이 과정을 거치치 않는다. 람다는 JVM의 invokedynamic 연산을 통해 동적으로 생성된다(후에 private static 메서드로 풀어지고, 실행된다).

 

 

람다와 클로저

 

모든 클로저는 람다이지만, 모든 람다가 클로저는 아니다.

 

람다가 자신의 블록 밖의 변수(외부 변수)에 접근하면(capture), 이는 클로저이다(클로저는 자바 1 에서부터 익명클래스의 형태로 이미 존재해왔다).

 

'Java > Core' 카테고리의 다른 글

Java 13 간략히 정리  (0) 2020.07.16
Java 12 간략히 정리  (0) 2020.07.15
Java 11 간략히 정리  (0) 2020.07.15
Java 10 간략히 정리  (0) 2020.07.15
IO, NIO, NIO2  (0) 2020.02.26

+ Recent posts