anonymous class vs lambda expression
anonymous class
익명 클래스는 클래스 선언과 동시에 인스턴스를 생성하는 클래스를 말한다
일반적으로 추상 클래스나 인터페이스를 간단하게 구현할 때 사용한다
특징
한 번만 사용되는 일회성 클래스로 이름을 가지지 않는다
선언과 동시에 객체를 생성한다
이름이 없으니까 생성자를 직접 정의할 수 없기 때문에 초기화 블록을 사용한다
지역 내부 클래스와 다르게 static 멤버를 가질 수 없다
컴파일된 클래스 파일의 이름
interface Greeting {
void sayHello();
}
public class Main {
public static void main(String[] args) {
Greeting greeting = new Greeting() {
@Override
public void sayHello() {
System.out.println("Hello from anonymous class!");
}
};
greeting.sayHello();
}
}
위와 같이 인터페이스를 구현한 익명 클래스를 가진 Main 클래스를 컴파일하면 아래와 같이 className$number.class
형식의 클래스 파일이 생성된다
Main$1.class
anonymous class vs lambda expression
비교 항목 | 익명 클래스 | 람다 표현식 |
---|---|---|
사용 대상 | 클래스(인터페이스 or 추상 클래스) | 함수형 인터페이스 (단일 메서드 인터페이스) |
이름 | 없음 (컴파일 시 $1 같은 이름 생성) | 없음 |
this 참조 | 익명 클래스 자신을 가리킴 | 람다를 감싸는 외부 클래스의 this |
생성자 사용 | 불가능 (초기화 블록 {} 사용) | 생성자가 없음 |
메모리 사용 | 객체 생성 (클래스 로딩 필요) | 더 가벼움 (실제 클래스로 생성되지 않음) |
오버라이딩 | 여러 메서드 오버라이딩 가능 | 오직 하나의 메서드만 구현 가능 |