[ 람다식(Lambda Expression) 이란? ]
람다식(Lambda Expression)이란 함수를 하나의 식(expression)으로 표현한 것이다. 함수를 람다식으로 표현하면 메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류라고 볼 수 있습니다.
람다식은 자바 버전 8부터 추가된 기능입니다.
람다식은 함수형 프로그래밍을 자바에서 구현하기 위해서 추가된 기능입니다.
람다식을 알기 전에 "함수형 프로그래밍이 무엇인가?"에 대해서 아는 것이 좋을 것 같으니 함수형 프로그래밍에 대한 링크는 밑의 링크 참조 바랍니다.
함수형 프로그래밍 - https://nut-alrnond.tistory.com/m/12
함수형 프로그래밍
선언형 프로그래밍 vs 함수형 프로그래밍 프로그래밍은 방식은 크게 명령형 프로그래밍, 선언형 프로그래밍으로 구분된다. - 명령형 프로그래밍(≒절차적 프로그래밍): 프로그래밍의 상태와 상
nut-alrnond.tistory.com
람다식은 1급 객체를 만족해야한다.
람다식은 인터페이스를 구현해야한다.
1급 객체(First-class citizen)
아래 3 가지조건을 충족한다면 1급 객체라고 할수 있습니다.
- 변수나 데이타에 할당 할 수 있어야 한다.
- 객체의 인자로 넘길 수 있어야 한다.
- 객체의 리턴값으로 리턴 할수 있어야 한다.
인터페이스
클래스 구현과 마찬가지로 람다식을 구현하기 위해서는 인터페이스가 존재해야함.
단, 단 하나의 추상 메소드만 인터페이스 안에 존재해야 람다식이 구현이 된다.
//단 하나의 추상 메소드만 포함할 수 있게 하는 어노테이션 @FunctionalInterface
@FunctionalInterface
interface Cal {
int apply(int x, int y);
}
Cal add = (x, y) -> x + y;
Cal sub = (x, y) -> x - y;
람다식 문법
//기본구조
// 인자 -> 바디
(int a, int b) -> { return a + b; }
//가능한 문법
// 인자 타입 생략 - interface를 이용하여 컴파일러가 추론
(a, b) -> { return a + b; }
// 하나의 statement의 경우 중괄호 생략 가능 (리턴문 제외)
(a, b) -> a + b ;
// 인자가 하나인 경우 인자 괄호 생략 가능
a-> a * 2 ;
// 인자가 없으면 빈 괄호로 표시
() -> System.out.println("hi joeylee") ;
// 메소드 참조 Method reference
// (value -> System.out.println(value)) 의 축약형
System.out::println
//잘못된 문법
//두개 이상의 인자의 경우 소괄호 생략 불가
a, b -> {return a + b;}
//리턴, 두개 이상의 statement의 경우 중괄호 생략 불가
a -> return a;
a -> System.out.println(a);
a = a + 1;
람다식, 익명 함수 구현, 클래스 구현 예시
- 람다식
interface Cal {
int apply(int x, int y);
}
Cal cal = (x, y) -> x + y;
cal.apply(1,2);
- 익명 함수 구현
interface Cal {
int apply(int x, int y);
}
Cal cal = new Cal(){
@Override
int apply(int x, int y){
int c = x + y;
return c;
}
cal.apply(1,2);
- 클래스 구현
interface Cal {
int apply(int x, int y);
}
public class Add implements Cal{
int apply(int x, int y){
int c = x + y;
return c;
}
}
Cal cal = new Add();
cal.apply(1,2);
'개발 인생 > 자바' 카테고리의 다른 글
Consider defining a bean of type of type ‘org.springframework.security.core.userdetails.UserDetailsService’ in your configuration. (0) | 2022.07.11 |
---|---|
[Spring] ApplicationContextAware (0) | 2022.03.15 |
[Spring] IoC/DI 제어의 역전/의존성 주입 (0) | 2022.03.12 |
[스프링]Get과 관련된 Annotation (0) | 2022.03.08 |