용용띠용 2025. 4. 21. 10:57

Lamda expression

: 함수형 인터페이스 안에 정의된 하나의 추상 메서드(SAM) 선언을 간결하게 표현한 것이다.

// 함수형 인터페이스: 딱 하나의 추상 메서드가 선언된 인터페이스이다. 

@FunctionalInterface
interface 함수형인터페이스명{
	//한 개의 추상 메서드
}

public class Main{
	public static void main(String[] args){
    	함수형인터페이스명 구현체명 = (메서드 매개변수) -> {
        	//메서드 본문
        }
    }
}

 

 

특징

1) 메서드 반환 타입, 이름, 매개변수 타입, return 생략 가능

//메서드 반환 타입, 이름 생략 가능
(int a, int b)->{
	return a + b;
}

// 매개변수 타입 생략 가능
(a, b)->{
	return a + b;
}

// return 생략 가능
(a, b)-> a + b;

1-1) 타입 생략이 가능한 이유

: 컴파일러가 람다 함수식을 보고 추론하여 타입을 유추한다. 

 

2) 변수에 함수 할당 가능

//함수형 인터페이스
interface Add{
	int add(int a, int b);
}

public class Main{
	public static void main(String[] args){
    	Add lamdaAdd = (x, y) -> x + y;	// 변수에 함수 할당
        lamdaAdd.add(1, 2);	//함수 사용
    }
}

 

3) 매개변수에 람다식 전달 가능

interface Add{
	int add(int a, int b);
}


public class Main{
	public static void main(String[] args){
    	int n = result((a, b) -> a + b);	//메서드 매개변수에 람다식 전달
    }

	public static int result(Add lamdaAdd){
    	return lamdaAdd.add(1, 2);
    }
}

 

4) 람다식을 반환값으로 사용 가능

interface Add{
	int add(int a, int b);
}

public class Main{
	public static void main(String[] args){
    	int fn = function();	//메서드 반환값이 람다식
        int result = fn.add(1, 2);
    }

	public static Add function(){
    	return (a, b) -> a + b;
    }
}

 

3~4)의 특징이 가능한 이유

: 람다식이 컴파일하면서 함수형 인터페이스의 인스턴스로 변환되기 때문이다.

 

 

한계

1) 문서화 할 수 없다.

2) 까다로운 디버깅: 문제가 어디서 발생했는지 확인하기 어렵다.

3) stream에서 람다를 사용하면 for문보다 성능이 떨어진다.

4) 람다식 남발 시 코드가 지저분해질 수 있다.

5) 재귀함수를 구축할 수 없다.

 

 

익명 클래스 방식과 람다식 방식 비교

1. 익명 클래스 방식

- 복잡하다

- 추상 메서드가 한 개 이상이더라도 사용할 수 있다.

@FunctionalInterface
interface Add{
	int add(int a, int b);
}

//익명 클래스 방식
Add a = new Add(){
    @Override
    int add(int a, int b){
    	return a + b;
    }
}

 

2. 람다식 방식

- 단순하다

- 추상 메서드가 한 개만 존재(SAM)할 때 사용할 수 있다.

@FunctionalInterface
interface Add{
	int add(int a, int b);
}

//익명 클래스 방식
Add a = (a, b) -> a + b;

 

정리

: 추상메서드가 한 개일 때 함수형 인터페이스를 구현한 익명 클래스가 사용되던 자리를 추상 메서드를 구현한 람다식으로 대체할 수 있다.