자바 개발을 하다 보면 익명 클래스와 람다 표현식 중 어떤 걸 써야 할지 고민될 때가 있죠.
두 문법은 비슷해 보이지만, 의외로 차이가 뚜렷합니다.
이번 포스팅에서는 자바의 두 대표 단축 문법인 람다(Lambda)와 익명 클래스(Anonymous Class)를 비교해보겠습니다.
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("클릭!");
}
});
new 인터페이스명()으로 바로 객체 생성
메서드 오버라이딩 필요
문법이 길다
button.setOnClickListener(v -> System.out.println("클릭!"));
-> 연산자 사용
함수형 인터페이스에만 사용 가능
짧고 가독성이 좋음
람다는 명확히 간결하고 직관적입니다.
반면, 익명 클래스는 코드가 장황하고 가독성이 떨어질 수 있습니다.
구분 this 키워드가 가리키는 대상
익명 클래스 익명 클래스 자신
람다 람다를 선언한 외부 클래스
필드나 메서드를 가질 수 있음
상태를 유지 가능
여러 메서드를 가진 인터페이스 구현 가능
함수형 인터페이스만 사용 가능 (메서드 1개)
필드나 상태 없음 (순수 함수 느낌)
구분 작동 방식
익명 클래스 컴파일 시 별도 클래스 파일 생성 (예: OuterClass$1.class)
람다 invokeDynamic 사용 → 런타임에 코드 연결
즉, 람다는 가볍고 동적, 익명 클래스는 정적이고 무겁다고 볼 수 있습니다.
둘 다 외부 지역 변수는 final 혹은 사실상 final(값 변경 안됨)만 접근 가능
바뀌는 값은 참조 불가
int a = 10; // OK
int b = 20; b++; // ❌ 캡처 불가
상황 추천 문법
단순한 콜백 or 이벤트 리스너 람다
여러 메서드를 구현해야 할 때 익명 클래스
상태를 유지해야 할 때 익명 클래스
자바 8 이전 버전 익명 클래스

람다는 자바 8의 대표적인 함수형 기능으로, 익명 클래스를 대체하는 현대적인 방식입니다.
다만 여전히 복잡한 인터페이스 구현이나 상태 유지가 필요한 상황에서는 익명 클래스가 유용할 수 있습니다.
상황에 따라 적절히 선택하면서 코드를 더 깔끔하고 효율적으로 만들어보세요!