자바에서 기능 구현이나 일회성 객체 생성 시 자주 사용되는 두 방식, 익명 클래스(Anonymous Class)와 람다 표현식(Lambda Expression)을 비교하여 명확히 이해해 보자.
Button button = new Button();
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("버튼 클릭");
}
});
new 인터페이스명() {} 형태로 작성해야 함Button button = new Button();
button.setOnClickListener(v -> System.out.println("버튼 클릭"));
-> 연산자를 사용하여 간결하게 표현this 키워드의 의미this: 익명 클래스 자체의 인스턴스를 참조this: 람다를 선언한 외부 클래스의 인스턴스를 참조public class OuterMain {
private String message = "외부 클래스";
public void execute() {
Runnable anonymous = new Runnable() {
private String message = "익명 클래스";
@Override
public void run() {
System.out.println("익명 클래스 this.message: " + this.message);
}
};
Runnable lambda = () -> System.out.println("람다 this.message: " + this.message);
anonymous.run();
lambda.run();
}
}
익명 클래스 this.message: 익명 클래스
람다 this.message: 외부 클래스
final int final1 = 10;
int final2 = 20; // 사실상 final
int changedVar = 30; // 값 변경되는 변수
Runnable lambda = () -> {
System.out.println(final1); // 가능
System.out.println(final2); // 가능
// System.out.println(changedVar); // 컴파일 오류
};
changedVar++;
OuterClass$1.class) 생성상황과 목적에 맞게 익명 클래스와 람다 표현식을 적절히 선택하여 활용하자