java

[Java] 람다 VS 익명 클래스

inhooo00 2025. 5. 12. 20:35

📍람다를 쓸까 익명 클래스를 쓸까?

1. 문법의 차이

자바에서 익명 클래스람다 표현식은 모두 간단하게 기능을 구현하거나, 일회성으로 사용할 객체를 만들 때 유용하지

, 그 사용 방식과 의도에는 차이가 있다.

 

// 익명 클래스 사용 예
Button button = new Button(); button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
System.out.println("버튼 클릭"); }
});
  • 익명 클래스는 클래스 선언하자마자 인스턴스를 생성하는 방법이다. 즉 하나의 클래스다.

 

// 람다 표현식 사용 예
Button button = new Button();
button.setOnClickListener(v -> System.out.println("버튼 클릭"));
  • 람다 표현식은 함수를 간결하게 표현할 수 있는 방식이다. 
  • -> 연산자로 매개변수와 실행 내용을 간단하게 구성할 수 있다.
  • 물론 인스턴스가 생성된다.


2. 코드의 간결함

  • 익명 클래스는 문법적으로 더 복잡하고 장황하다. new 인터페이스명() 같은 형태와 함께 메서드를 오버라이드해야 하므로 코드의 양이 상대적으로 많다.
  • 람다 표현식은 간결하며, 불필요한 코드를 최소화한다. 또한 많은 생략 기능을 지원해서 핵심 코드만 작성할 수 있다.

 

3. 상속 관계

  • 익명 클래스는 다양한 인터페이스와 클래스를 구현하거나 상속할 수 있다.
  • 하지만 람다 표현식은 메서드를 딱 하나만 가지는 함수형 인터페이스만을 구현할 수 있다. 즉, 클래스를 상속할 수 없고 오직 함수형 인터페이스, 심지어 하나의 메서드를 가지는 인터페이스만 상속 가능하다.

 

4. 호환성

  • 자바 8부터 람다 표현식이 도입되어서 그 이후에나 람다 표현식을 사용할 수 있다.

 

 

5. this 키워드의 의미

  • 익명 클래스 내부의 this는 익명 클래스 자신을 가르킨다.
  • 하지만 람다 표현식에서의 this는 람다를 선언한 클래스의 인스턴스를 가르킨다.

 

 

6. 캡처링

  • 익명 클래스람다 모두 캡처링을 지원한다. 지역 변수는 반드시 final 혹은 사실상 final인 변수만 캡쳐할 수 있다.
  • 익명 클래스나 람다 안에서 외부의 지역 변수를 캡처해서 사용할 수 있다. 단 이때 `final` , `사실상 final` 지역 변수만 접근할 수 있다.

 

 

7. 생성 방식

  • 익명 클래스는 새로운 클래스를 정의해서 객체를 생성하는 방식이다. 즉 클래스 파일이 생성되는 것이다.
  • 이 방식은 메모리 상에서 별도로 관리되므로 메모리 상에 약간의 추가 오버헤드가 발생한다. + JVM 활동도 필요함.
  • 람다는 내부적으로 invokeDynamic이라는 메커니즘을 사용하여 컴파일 타임에 실제 클래스 파일을 생성하지 않고, 런타임 싣점에서 동적으로 필요한 코드를 처리한다.
  • 따라서 람다는 익명 클래스보다 메모리 관리가 더 효율적이며, 생성된 클래스 파일이 없으므로 클래스 파일 관리의 복잡성도 줄어든다.

 

 

8. 상태 관리

  • 익명 클래스는 인스턴스 내부에 필드와 멤버 변수를 가질 수 있다.
  • 따라서 상태를 필요로 하는 경우, 익명 클래스를 사용하자.
  • 람다는 그 내부에서 필드, 멤버 변수와 메서드를 한번에 가지고 있다. 또 함수는 그 내부에 필드를 가지지 않고 기능만 제공한다.
  • 함수인 람다는 기본적으로 필드가 없으므로 상태를 유지하지는 않는다.

 

 

9. 익명 클래스와 람다의 용도 구분

  • 익명 클래스는 상태를 유지하거나 다중 메서드를 구현할 필요가 있을 때 사용
  • 기존 클래스 또는 인터페이스를 상속하거나 구현할 때 사용
  • 복잡한 인터페이스 구현이 필요할 때 사용
  • 람다는 상태 유지가 필요 없고, 간결함이 중요한 경우 사용
  • 단일 메서드만 필요한 간단한 함수형 인터페이스 구현 시 사용
  • 더 나은 성능과 간결한 코드가 필요한 경우 사용

 

 

📍정리하자면..

대부분의 경우 익명 클래스를 람다로 대체할 수 있다.
하지만 여러 메서드를 가진 인터페이스나 클래스의 경우에 는 여전히 익명 클래스가 필요할 수 있다.
자바 8 이후에는 익명 클래스, 람다 둘 다 선택할 수 있는 경우라면 익명 클래스 보다는 람다를 선택하는 것이 간 결한 코드, 가독성 관점에서 대부분 더 나은 선택이다.

'java' 카테고리의 다른 글

[Java] 메서드 참조  (0) 2025.05.20
[Java] 람다의 활용  (0) 2025.05.05
[Java] 함수형 인터페이스  (0) 2025.04.11
[Java] 람다가 필요한 이유와 생략 규칙  (0) 2025.04.07
[Java] 튜닝의 마지막 단계 GC 알아보기  (0) 2025.02.05