Language/Java
Lamda
용용띠용
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;
정리
: 추상메서드가 한 개일 때 함수형 인터페이스를 구현한 익명 클래스가 사용되던 자리를 추상 메서드를 구현한 람다식으로 대체할 수 있다.