반응형

람다식 (Lambda Expression)

  • 함수(메서드)를 간단한 '식(expression)'으로 표현하는 방법


람다식이란, 함수(메서드)를 간단한 식(expression)으로 표현하는 방법 이다.

예를 들어, max라는 메서드가 있을 때, 우측처럼 짧게 표현하려고 하는 것이 람다식이다.

  • 익명 함수(이름이 없는 함수, anonymous function)


이 메서드를 람다식으로 바꿀 때 어떻게 하냐면, 반환 타입과 이름을 지운다.
그리고 {}블록 앞에 "->" 화살표를 넣는다. 그러면 람다식이 된다.
이렇게하면 이름이 없어지기 때문에 익명함수라고 한다.

  • 함수와 메서드의 차이
    • 근본적으로 동일, 함수는 일반적 용어, 메서드는 객체지향개념 용어
    • 함수는 클래스에 독립적, 메서드는 클래스에 종속적

 

 


 

람다식 작성하기

1. 메서드의 이름과 반환타입을 제거하고 "->"를 블록{} 앞에 추가한다.

반환타입과 이름을 지우고, {}블록앞에 "->"를 추가하면 된다.

여기까지만 해도 람다식이 완성된 것이다.
그런데 람다식이라는 것은 함수(메서드)를 간단히 표현하기 위한 것이다.
따라서, 좀더 간단히 할 수 있는 규칙들이 있다.



2. 반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능(끝에';' 안붙임)


반환값이 있으면, 식이나 값만 적고 return문 생략 가능하다.
그러면 무엇이 리턴타입이냐면, 위 코드의 경우 a가 b보다 크냐고 물어봤으므로, 크면 a가 반환되고, 작으면 b가 반환된다.
즉, 위코드에서는 a나 b가 반환값이 된다.


3. 매개변수의 타입이 추론 가능하면 생략가능(대부분의 경우 생략가능)

매개변수의 타입이 추론 가능하면 생략가능하다. 대부분의 경우 생략이 가능하다.
그래서 매개변수의 타입까지 생략하면 람다식이 더간단해지는 것을 확인할 수 있다.

 


 

람다식 작성하기 - 주의사항


1. 매개변수가 하나인 경우, 괄호() 생략 가능(타입이 었을 때만)

매개변수가 하나일 때는, 괄호를 생략할 수 있다. 그런데 만약에 타입을 생략하지 않으면, 매개변수가 하나여도 괄호를 생략할 수 없다.


2. 블록안의 문장이 하나뿐 일 때, 괄호{} 생략가능(끝에 ';' 안 붙임)

블록안의 문장이 하나일 때는 괄호{}를 생략할 수 있다. 끝에 세미콜론;을 붙이지 않는다.

단, 하나뿐인 문장이 return문이면 괄호{} 생략 불가

그런데, 대부분 return을 생략하기 때문에 이 조건은 가볍게 보고 넘어가자.

 


 

람다식의 예

 

 


 

람다식은 익명 함수? 익명 객체!!!

  • 람다식은 익명 함수가 아니라 익명 객체이다.

자바에서 람다식은 익명 함수가 아니라 익명 객체다. 왜냐하면 자바에서는 메서드만 따로 존재할 수 없기 때문이다.


그래서 이러한 람다식이 있을 때, 오른쪽 코드와 똑같은 것이다.
익명클래스의 객체이다.
객체의 선언과 생성을 동시에 하는 것이다.

원래는 오른쪽 처럼 익명 클래스의 객체로 작성해야 하는데, 이것을 간단하게 람다식으로 사용하는 것이다.

결국, 람다식은 객체다.

 

  • 람다식(익명 객체)을 다루기 위한 참조변수가 필요. 참조변수의 타입은?

람다식(익명 객체)를 다루려면 참조변수가 필요하다.
참조변수의 타입은 무엇으로 해야할까?

만약에 이렇게 Object익명객체라면 참조변수 타입을 Object로 하면 될 것이다.

그런데, 문제가 있다.
람다식이 객체니까 람다식을 다루려면 참조변수가 필요하고, 참조변수의 타입이 필요한데,
그것을 Object로 하면 되긴 되는데, Object 클래스에 max()가 없다.

Object객체는 max메서드를 분명 가지고 있는데, 이 메서드를 사용할 수 없다.
obj라는 리모콘에는 max버튼이 없는 것이다.
그래서 실제로 이 객체가 해당 메서드를 가지고 있어도 호출할 수 가 없게 되는 것이다.

 

이것을 어떻게 해결해야 하는지는 다음시간에 알아볼 것이다.

 

[Ex14_9]

반응형

'JAVA' 카테고리의 다른 글

java.util.function 패키지  (0) 2022.08.01
함수형 인터페이스  (0) 2022.07.30
wait()과 notify()  (0) 2022.07.27
쓰레드의 동기화  (0) 2022.07.09
join(), yield()  (0) 2022.07.07