티스토리 뷰
1. 람다식이란?
메서드를 하나의 식(expression)으로 표현한 것이다.
람다식은 함수를 간략하면서도 명확한 식으로 표현할 수 있게 해준다.
익명함수 라고도 한다.
람다식을 통해 메서드를 매개변수로 전달하고, 메서드의 결과로 반환될 수도 있다.
메서드를 변수처럼 다루는 것이 가능해진 것이다.
2. 표현법
1. 메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 몸통{} 사이에 ->를 추가한다.
2. 반환 값이 있는 경우, retur문 대신 '식'으로 대신할 수 있다. 식의 연산결과가 자동적으로 반환값이 된다.
이때는 문장이 아닌 식이므로 끝에 ;를 붙이지 않는다.
3. 매개변수의 타입은 추론이 가능한 경우는 생략가능하다. 대부분의 경우도 생략이 가능하다.
int max(int a, int b){
return a > b? a: b;
}
(a, b) -> {a > b? a: b}
3. 함수형 인터페이스
자바에서 모든 메서드는 클래스 내에 포함되어야 한다. 람다식은 익명 클래스의 객체와 동등하다.
(int a, int b) -> a > b? a : b
||
new Object(){
int max(int a, int b){
return a > b? a : b;
}
}
익명 객체의 메서드는 참조변수가 있어야 호출 할 수 있다. 익명 객체의 주소를 f라는 참조변수에 저장하면.
그 참조 변수의 타입은 뭘로 해야 할까?
max라는 메서드를 호출 할 수 있는 클래스 또는 인터페이스여야 한다.
max()라는 메서드가 정의된 MyFunction인터페이스가 정의되어 있다고 가정하면 이와같다.
MyFunction f = new MyFunction(){
public int max(int a, int b){
return a > b? a : b;
}
};
int big = f.max(5,3); //익명 객체의 메서드를 호출
이 람다식을 다루기 위한 인터페이스를 '함수형 인터페이스'로 부른다.
@Funtionalnterface
interface MyFunction{
public abstract int max(int a, int b);
}
함수형 인터페이스는 오직 하나의 추상 메서드만 정의되어 있어야 한다. 그래야 람다식과 인터페이스의 메서드가 1:1로 연결될 수 있기 때문이다. static메서드와 default메서드의 개수는 제약이 없다.
4. 함수형 인터페이스 타입의 매개변수, 반환타입
1) 매개변수
@Funtionalnterface
interface MyFunction{
void myMethod();
}
void aMethod(MyFunction f){
f.myMethod(); //람다식 호출
}
MyFunction f = () -> System.out.prinln("myMethod()");
aMethod(f);
||
aMethod(() -> System.out.println("myMethod()"));
2) 반환타입
MyFunction meMethod(){
MyFunction f = () ->{};
return f; //람다식 반환
}
||
MyFunction myMethod(){
return () -> {};
}
참조변수 없이 람다식을 직접 매개변수로 지정하는 것도 가능하다.
람다식을 참조변수로 다룰 수 있다는 것은 메서드를 통해 람다식을 주고 받을 수 있다는 것을 의미한다.
즉, 변수처럼 메서드를 주고받는 것이 가능해진 것이다.
사실상 메서드가 아니라 객체를 주고받는 것이라 근본적으로 달라진 것은 아무것도 없지만,
람다식 덕분에 코드가 더 간결하고 이해하기 쉬워졌다.
'Java' 카테고리의 다른 글
Java - Reflection API (리플렉션) 이란? (0) | 2022.06.08 |
---|---|
Java - Servlet(서블릿) 이란? (0) | 2022.06.08 |
HttpSession을 이용한 세션 저장법 (0) | 2021.11.05 |
서블릿 컨테이너란? 웹 애플리케이션 서버란? (0) | 2021.10.12 |