익명클래스와 lambda

dev_dong·2025년 6월 18일

익명클래스와 람다는 동일하지 않다.

익명클래스

  • 익명클래스는 말 그대로 이름이 없는 클래스를 뜻함
  • 클래스 정의와 동시에, 객체를 생성할 수 있음.
  • Java의 Interface와 Class 모두 익명 함수로 객체를 만들 수 있음.
public class AnonymousClassExample {
   public AnonymousClassExample() {
   }

   public static void main(String[] var0) {
      AnonymousClassExample$1 var1 = new AnonymousClassExample$1();
      var1.execute();
   }
}


컴파일하면 AnonymousClassExample$1.class 같은 별도의 내부 클래스 파일이 생성됨.
실제로 클래스 인스턴스가 하나 만들어지고, 그 내부에 메서드가 구현됨.
자바의 전통적인 객체지향 방식.

람다

  • 클래스를 구현하지 않아도 됨.
  • 인터페이스(추상 메서드)를 구현.
  • 인자를 전달할 수 있고, 결과를 리턴할 수 있음.
  • 코드가 간결하다

별도의 클래스 파일이 생기지 않음.
invokedynamic이라는 JVM 명령어와, 런타임에 필요한 코드만 동적으로 생성함.
메서드 핸들(Method Handle), 람다 팩토리 등을 이용해서 훨씬 효율적으로 동작함.

결론

익명 클래스의 경우, AnonymousClassExample$1.class 와 같이 별도의 class 파일을 생성하고, 이 파일이 객체로 만들어져 "콜백" 등으로 사용됨.

하지만, 람다 표현식 자체가 "함수 자체" 를 값처럼 넘기기 위해 사용되다 보니, 별도의 class파일을 생성하지 않고, invokedynamic 명령어와 LambdaMetafactory를 사용하여, 필요할 때만 런타임에 동적으로 함수 객체를 생성함.

왜 이런 차이가 생겼을까 ?

예제 코드 : https://github.com/dgseo1101/anonymous_lambda
(순환참조 에러나겠다)

profile
개발 잘하고 싶은 동근이의 공부방 (임시글 만수르)

0개의 댓글