Java/강의

[📙 Java 문법 종합반] 3-5. 람다(Lambda)

가지코딩 2025. 4. 16. 19:51

📙 목차

  1. 익명 클래스
  2. 람다(Lambda)
  3. 람다 사용 시 주의사항
  4. 람다식을 매개변수로 전달하는 방법

🧡 학습 목표

  • 람다가 무엇인지 학습한다.

1. 익명 클래스

  • 이름이 없는 클래스를 익명 클래스라고 한다.
  • 별도의 클래스 파일을 만들지 않고 코드 내에서 일회성으로 정의해 사용하기 때문에 이름이 없다고 한다.
  • 인터페이스, 클래스(일반, 추상)의 구현과 상속을 활용해 익명 클래스를 구현할 수 있다.
  • 람다에서는 인터페이스를 사용한 익명 클래스가 활용된다.

 

익명 클래스 예제

  • 익명 클래스를 코드내에서 직접 구현하기 때문에 클래스 파일을 만들 필요가 없다.
  • 하지만 코드가 길어진다.
public class Main {
    public static void main(String[] args) {
    
        // ✅ 익명 클래스 활용
        Calculator calculator1 = new Calculator() {
            @Override
            public int sum(int a, int b) {
                return a + b;
            }
        };
        
        int ret1 = calculator1.sum(1, 1);
        System.out.println("ret1 = " + ret1);
    }
}

2. 람다(Lambda)

  • 익명 클래스를 더 간결하게 표현하는 문법이다.
  • 함수형 인터페이스 를 통해서 구현하는 것을 권장한다.
    • 하나의 추상 메서드만 가져야하기 때문이다.
    • 하나의 추상 메서드를 가진 일반 인터페이스를 통해서도 사용 가능하다.
// 람다 표현식
Calculator calculator1 = (a, b) -> a + b;

// 컴파일 시 익명클래스로 구현됨
Calculator calculator1 = new Calculator() {
    @Override
    public int sum(int a, int b) {
        return a + b;
    }
};
// 함수형 인터페이스 선언
@FunctionalInterface
public interface Calculator {
    int sum(int a, int b); // 오직 하나의 추상 메서드만 선언해야 한다.
}

-----

public class Main {
    public static void main(String[] args) {
        // 람다식 활용
        Calculator calculator2 = (a, b) -> a + b;
        int ret2 = calculator2.sum(2, 2);
        System.out.println("ret2 = " + ret2);
    }
}

3. 람다 사용 시 주의사항

람다식을 활용할때는 꼭 함수형 인터페이스를 활용해야 한다.

  • 함수형 인터페이스는 단 하나의 추상 메서드만 가지도록 강제하는 어노테이션이다.
  • 람다식에서는 함수형 인터페이스가 활용된다.
  • 인터페이스에 두 개 이상의 추상 메서드가 존재하면 컴파일러가 어떤 메서드를 구현하는지 모호해진다. → 컴파일 에러 발생
@FunctionalInterface
public interface Calculator {
    int sum(int a, int b); // ✅ 오직 하나의 추상 메서드만 선언해야합니다.
    int sum(int a, int b, int c); // ❌ 선언 불가 에러발생!
}

4. 람다식을 매개변수로 전달하는 방법

익명 클래스를 변수에 담아 전달

  • 람다식 없이 직접 객체를 생성해서 전달하는 방식
  • 클래스의 익명 객체를 만든 다음에 매개변수로 전달한다.
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);
        System.out.println("ret3 = " + ret3); // 출력: ret3 = 6
    }
}

 

 

람다식을 변수에 담아 전달

  • 람다식을 변수에 담아 매개변수로 전달하는 방식
  • 람다식을 전달하면 calculate() 메서드의  매개변수의 타입으로 Calculator 인터페이스를 구현했는지 추론되기 때문에 람다식을 전달 가능하다.
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);
        System.out.println("ret4 = " + ret4); // 출력: ret4 = 8
    }
}

 

 

람다식을 직접 전달

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);
        System.out.println("ret5 = " + ret5); // 출력: ret5 = 10
    }
}