람다식은 객체지향 언어보다는 함수지향 언어에 가깝다. 객체지향 언어인 자바가 람다식을 수용한 이유는 코드가 매우 간결해지고 컬렉션의 요소를 필터링하거나 매핑해서 원하는 결과를 쉽게 집계할 수 있기 때문이라고 한다.

람다식은 "(매개변수) -> { 실행코드 }" 형태로 작성되는데, 마치 함수 정의 형태를 띠고 있지만 런타임 시에 인터페이스의 익명 구현 객체로 생성된다. 

 

람다식의 기본 문법

람다식을 작성하는 방법은 다음과 같다.

(타입, 매개변수) -> { 실행문 } 

예를 들어 int 매개 변수 a의 값을 콘솔에 출력하기 위해 다음과 같이 람다식을 작성할 수 있다.

(int a) -> { System.out.println(a); }

매개 변수의 타입은 대입되는 값에 따라 자동으로 인식될 수 있기 때문에 생략해도 무방하다.

 

하나의 매개변수만 있다면 괄호를 생략 할 수 있고, 하나의 실행문만 있다면 중괄호도 생략이 가능하다.

a -> System.out.println(a)

만약 매개변수가 없다면 빈 괄호를 사용하여 작성한다.

 

만약 어떤 작업을 수행후 리턴해야 하는 값이 있으면 return을 적어주고 만약 return만 있다면 return 생략 하여 작성할 수 있다.

(x, y) -> x + y

 

람다식은 인터페이스 변수에 대입된다. 인터페이스는 직접 객체화 할 수 없기때문에 구현 클래스가 필요한데, 람다식은 익명 구현 클래스를 생성하고 객체화한다. 람다식은 대입될 인터페이스의 종류에 따라 작성 방법이 달라지기 때문에 람다식이 대입될 인터페이스를 람다식의 타켓 타입이라고 한다.

 

람다식의 실행 블록에는 클래스의 멤버(필드와 메서드) 및 로컬 변수를 사용할 수 있다. 클래스의 멤버는 제약 사항 없이 사용 가능하지만, 로컬 변수는 제약 사항이 따른다. 

 

자바 8부터는 빈번하게 사용되는 함수적 인터페이스는 표준 API 패키지로 제공한다. 크게 Consumer, Supplier, Function, Operator, Predicate로 구분된다.

종류 특징
Consumer 매개값은 있고 리턴값은 없음
Supplier 매개값은 없고, 리턴값은 있음
Function 매개값도 있고 리턴값도 있음
주로 매개값을 리턴값으로 매핑(타입 변환)
Operator 매개값도 있고, 리턴값도 있음
주로 매개값을 연산하고 결과를 리턴
Predicate 매개값은 있고, 리턴값은 boolean
매개값을 조사해서 true/false를 리턴

메소드 참조 

메소드를 참조해서 매개 변수의 정보 및 리턴 타입을 알아내어, 람다식에 불필요한 매개 변수를 제거하는 것이 목적이다.

예를들어 두개의 값을 받아 큰 수를 리턴하는 Math 클래스의 max() 정적 메소드를 호출하는 람다식은 다음과 같다.

(left, right) -> Math.max(left, right);

이 경우에는 다음과 같이 메소드 참조를 이용하면 매우 깔끔하게 처리할 수 있다.

Math::max

 

정적(static)메서드를 참조할 경우에는 클래스 이름 뒤에 :: 기호를 붙이고 정적 메소드 이름을 적으면된다.

클래스 :: 메소드

 

인스턴스 메서드일 경우에는 먼저 객체를 생성한 다음 참조 변수 뒤에 :: 기호를 붙이고 인스턴스 메서드 이름을 적으면된다.

참조변수 :: 메서드

 

 

'JAVA' 카테고리의 다른 글

서블릿, 서블릿 컨테이너  (0) 2021.06.04
POJO Java  (0) 2021.05.09
Java I/O Stream - 4 성능 향상 보조 스트림  (0) 2021.05.07
Java Stream  (0) 2021.05.07
Java I/O Stream -2 파일 입출력  (0) 2021.05.07

+ Recent posts