Java/문법

Lambda - 익명 클래스를 간결하게 표현해보자

JuNo_12 2025. 4. 17. 21:40

우선 람다식을 사용하기 위해서는 함수형 인터페이스를 활용해야한다. 이는 아래에서 자세히 다뤄보자.

 

함수형 인터페이스(Functional Interface)란?

: 오직 하나의 추상 메서드만 가지는 인터페이스

 

  • 문서화: "이 인터페이스는 함수형으로 쓰기 위한 거다!" 하고 명확하게 선언
  • 검증: 추상 메서드가 2개 이상이면 컴파일 에러 발생해서 실수 방지
  • @FunctionalInterface를 통해 선언 가능하다.

 

 

익명 클래스란?

말 그대로 이름이 없는 클래스이다. 이게 무슨 의미일까?

이는 별도의 클래스 파일을 만들지 않고 코드 내에서 '일회성'으로 정의해 사용하기 때문이다.

인터페이스, 클래스(일반, 추상)의 구현과 상속을 활용해 익명 클래스를 구현할 수 있다.

(여기서 이해가 잘 안된다면, 앞의 포스팅들 중에서 '객체지향 이해하기' 포스팅을 가서 공부해보자.)

 

아무튼, 람다에서는 인터페이스를 활용한 익명 클래스가 활용된다.

 

일단, 방법이 3가지가 있다.

1. 람다식 없이 익명 클래스를 변수에 담아 전달

2. 람다식을 변수에 담아 전달

3. 람다식을 직접 전달

장단점을 표로 정리해 두었으니, 상황에 맞게 사용하면 된다.

 

항목별 장단점

항목 장점 단점
1. 익명 클래스 - 람다보다 명확하게 타입 표현
- this는 익명 클래스 자신을 가리킴
- 코드가 장황함
- 람다보다 가독성 떨어짐
2. 람다 변수 저장 - 재사용 가능
- 코드가 간결함
- 디버깅 시 이름으로 확인 가능
- 너무 짧게 쓰는 람다에는 불필요한 변수일 수 있음
3. 람다 직접 전달 - 가장 간결하고 직관적
- 일회성 작업에 최적화
- 재사용 불가
- 너무 복잡한 람다면 가독성 떨어질 수 있음

 

 

1. 람다식 없이 익명 클래스를 변수에 담아 전달

@FunctionalInterface 
// 문서화: "이 인터페이스는 함수형으로 쓰기 위한 거다!" 하고 명확하게 선언
// 검증 : 추상 메서드가 2개 이상이면 컴파일 에러 발생해서 실수 방지

public interface Calculator {

    int sum(int a, int b);
}
// 위에 코드는 아래도 동일하게 필요
------------------------------------------------------------------------------

public class Main {
    public static int calculate(int a, int b, Calculator calculator) {
        return calculator.sum(a, b);
    }

    public static void main(String[] args) {

        Calculator cal1 = new Calculator() {
            @Override
            public int sum(int a, int b) {
                return a + b;
            }
        };

        int ret3 = calculate(3, 3, cal1);
    }
}

 

2. 람다식을 변수에 담아 전달

public class Main {

    public static int calculate(int a, int b, Calculator calculator) {
        return calculator.sum(a, b);
    }

    public static void main(String[] args) {
        Calculator cal2 = (a, b) -> a + b;
       
        int ret4 = calculate(4, 4, cal2);
    }
}

 

3. 람다식을 직접 전달

public class Main {

    public static int calculate(int a, int b, Calculator calculator) {
        return calculator.sum(a, b);
    }

    public static void main(String[] args) {
        int ret5 = calculate(5, 5, (a, b) -> a + b);
    }
}