티스토리 뷰

TIL

자바 람다식에 대해

해미깨미 2021. 2. 8. 23:11

오늘은 자바 람다식에 대해 공부를 했다.

내가 읽고 공부한 책은 이것이 자바다 신용권의 Java 프로그래밍 정복이라는 책이며 오늘 공부하면서 배운 내용을 정리 하려고 한다.

 

람다식이란?

 

  • 자바는 함수적 프로그래밍을 위해 자바 8부터 람다식을 지원하기 시작했다.
  • 람다식은 익명 함수(anonymous function)를 생성하기 위한 식으로 객체 지향 언어보다는 함수 지향 언어에 가깝다.
  • 람다식의 형태는 매개 변수를 가진 코드 블록이지만, 런타임 시에는 익명 구현 객체를 생성한다.

 

람다식 기본 문법

// 람다식은 일반적으로 매개변수 타입을 언급하지 않는다.
(a) -> {System.out.println(a);}

// 매개변수가 하나고 실행문도 하나
a -> System.out.println(a)

// 리턴값이 있는 경우
(x, y) -> {return x + y;}

// 중괄호 {}에 return문만 있을 경우, return문 생략 가능
(x, y) -> x + y

 

타겟 타입과 함수적 인터페이스

인터페이스 변수 = 람다식;

람다식은 인터페이스 변수에 대입된다.

람다식이 대입될 인터페이스를 람다식의 타겟 타입(target type)이라고 한다.

 

함수적 인터페이스(@FunctionalInterface)

 

  • 추상 메소드를 하나만 선언된 인터페이스를 함수적 인터페이스라고 한다.
  • 디폴트 및 정적 메소드는 추상 메소드가 아니기 때문에 함수적 인터페이스에 선언되어도 함수적 인터페이스의 성질을 잃지 않는다.
  • @FunctionalInterface 어노테이션은 선택사항이다. 하나의 추상 메소드만 있으면 기본적으로 함수적 인터페이스 이므로 실수로 두 개 이상의 추상 메소드를 선언하는 것을 방지하려면 @FunctionalInterface 어노테이션을 추가하자.

 

 표준 API의 함수적 인터페이스

자바 8부터 함수적 인터페이스는 java.util.function 표준 API 패키지로 제공한다.

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

 

andThen()과 compose() 티폴트 메소드

andThen()과 compose() 메소드는 두 개의 함수적 인터페이스를 순차적으로 연결하고,  첫 번째 처리 결과를 두 번째 매개값으로 제공해서 최종 결과값을 얻을 때 사용한다.

 

  • andThen()
인터페이스AB = 인터페이스A.andThen(인터페이스B);
최종결과 = 인터페이스AB.method();
  • compose()
인터페이스AB = 인터페이스A.compose(인터페이스B);
최종결과 = 인터페이스AB.method();

 

and(), or(), negate() 디폴트 메소드와 isEqual() 정적 메소드

 

  • Preidcate 종류의 함수적 인터페이스는 각각 &&, ||, !과 대응되는 and(), or(), negate() 디폴트 메소드를 가지고 있다.
  • isEqual() 메소드는 test() 매개값인 sourceObject와 isEqual()의 매개값인 targetObject를 java.util.Objects 클래스의 equals()의 매개값으로 제공하고, Objects.equals(sourceObject, targetObject)의 리턴값을 얻어 새로운 Predicate<T>를 생성한다.
Predicate<Object> predicate = Predicate.isEqual(targetObject);
boolean result = predicate.test(sourceObject);

 

minBy(), maxBy() 정적 메소드

BinaryOperator<T> 함수적 인터페이스는 minBy(), maxBy() 정적 메소드를 제공한다.

리턴 타입 정적 메소드
BinaryOperator<T> minBy(Comparator<? super T> comparator)
BinaryOperator<T> maxBy(Comparator<? super T> comparator)

 

메소드 참조

// 메소드 참조를 이용해서 줄일 수 있다.
// (left, right) -> Math.max(left, right);
Math::max;

// 정적 메소드 참조할 경우
클래스::메소드

// 인스턴스 메소드
참조변수::메소드

// 매개 변수의 메소드 참조
// (a, b) -> {a.instanceMethod(b);}
a::instanceMethod

// 생성자 참조
// (a, b) -> {return new 클래스(a, b);}
클래스::new
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함