Notice
Recent Posts
Recent Comments
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Spring & Java

람다 (Lambda) 본문

JAVA 개념 확장

람다 (Lambda)

dev.hyuck 2025. 12. 17. 17:13

 

예외 ( Exception )과 예외처리 (try-catch)

Optional - null을 다루는 법

제네릭 ( Generic )

컬렉션 ( Collection )

람다 ( Lambda )

 

학습 키워드 

익명 클래스 - 별도의 클래스 파일을 만들지 않고 코드 내에서 일회성으로 정의해 사용하는 클래스

함수형 인터페이스 - 단 하나의 추상 메서드만 가지도록 강제되어 람다식에 활용되는 인터페이스

오버로딩 - 클래스나 인터페이스 내에서 동일한 메서드 이름을 사용해서 선언하는 기능입니다.

람다식 - 익명 클래스를 간결하게 표현하는 문법

 

익명 클래스

익명 클래스란?

● 익명 클래스는 이름이 없는 클래스를 익명 클래스라고 합니다.

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

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

-> 람다에서는 인터페이스를 사용한 익명 클래스가 활용됩니다.

 

인터페이스를 활용한 익명 클래스 예제

● 익명 클래스를 코드내에서 직접 구현하기 때문에 클래스 파일을 만들 필요가 없습니다.

-> 하지만 코드가 길어집니다.

public interface Calculator {

    int sum(int a, int b);
}

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);
    }
}

 

람다 ( Lambda )

람다가 무엇인지 학습해 봅시다.

● 람다는 익명 클래스를 더 간결하게 표현하는 문법입니다.

● 함수형 인터페이스를 통해서 구현하는 것을 권장합니다.

-> 하나의 추상 메서드만 가져야 하기 때문입니다.

-> 하나의 추상 메서드를 가진 일반 인터페이스를 통해서도 사용 가능합니다.

 

람다식을 활용한 익명 클래스 변환 방법

● 컴파일 시점에 컴파이럴가 ( a , b )  -> a + b 람다 표현식을 보고 sum() 메서드를 가진 익명 클래스를 구현합니다.

● Calculator 인터페이스에 추상 메서드가 하나뿐이기 때문에 컴파일러는 ( a, b) -> a + b 람다 표현식이 sum() 메서드라고 추론 가능하기 때문입니다.

 

// 람다 표현식
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);
    }
}

 

 

람다 사용시 주의사항

람다식을 활용할때는 꼭 함수영 인터페이스를 활용합시다.

● 함수형 인터페이스는 단 하나의 추상 메서드만 가지도록 강제하는 어노테이션입니다.

● 람다식에서는 함수형 인터페이스가 활용됩니다.

● 인터페이스에 두개 이상의 추상 메서드가 존재하면 컴파일러가 어떤 메서드를 구현하는지 모호해지기 때문입니다.

● 예를 들어 오버로딩 기능을 통해 같은 이름의 sum() 메서드를 여러 형태로 정의한다면 람다 표현식이 어떤 메서드를 구현하는 것인지 명확하지 않아 모호성이 발생할 수 있습니다.

public interface Calculator {
    int sum(int a, int b);        // ✅ 선언 가능
    int sum(int a, int b, int c); // ⚠️ 오버로딩으로 선언 가능 모호성 발생!
}

@FunctionalInterface // ✅ 함수형 인터페이스 선언
public interface Calculator {
    int sum(int a, int b); // ✅ 오직 하나의 추상 메서드만 선언해야합니다.
    int sum(int a, int b, int c); // ❌ 선언 불가 에러발생!
}

 

오버 로딩( Overloading ) vs 오버라이딩 ( Overriding )

오버로딩(Overloading) vs 오버라이딩(Overriding) 
오버로딩은 같은 클래스나 인터페이스 내에서 동일한 메서드 이름을 사용해서 선언하는 기능입니다.
→  매개변수의 개수나 타입, 순서는 다르게 선언해야 합니다.
오버라이딩은 부모 클래스에 정의된 메서드를 자식 클래스에서 재정의하는 것을 의미합니다.

 

 

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

● 람다식 없이 직접 객체를 생성해서 전달하는 방식입니다.

● 클래스의 익명 객체를 만든 다음에 매개변수로 전달합니다.

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) {
        // ✅ 람다식을 직접 매개변수로 전달
        int ret5 = calculate(5, 5, (a, b) -> a + b);
        System.out.println("ret5 = " + ret5); // 출력: ret5 = 10
    }
}

'JAVA 개념 확장' 카테고리의 다른 글

쓰레드 ( Thread )  (0) 2025.12.18
스트림 ( Stream )  (0) 2025.12.18
제네릭 ( Generic )  (0) 2025.12.15
컬렉션 ( Collection )  (0) 2025.12.15
Optional - null을 다루는 법  (0) 2025.12.12