[Java] Lambda - 람다식이란?, 함수형 인터페이스

eeminsu·2021년 12월 11일
0
post-thumbnail

자바의 정석을 통해 공부한 내용을 요약하였습니다.

1. 람다식이란?

  • JDK1.8부터 추가되었다.
  • 메서드를 하나의 '식(expression)'으로 표현한 것이다.
  • 이름과 반환값이 없어 '익명 함수(anonymous function)'라고 한다.

메서드와 함수의 차이

  • 메서드와 함수는 같은 의미
  • 그러나 메서드는 클래스에 종속적, 함수는 클레스에 독립적
  • 메서드는 객체지향개념 용어

람다식 작성하기

// 일반 메서드
int max(int a, int b) {
	return a > b ? a:b;
}

// 람다식
(a,b) -> a > b? a:b
  • 이름과 반환타입을 제거하고 선언부와 {}사이에 '->'를 추가한다.
  • 반환값이 있는 메서드는 return대신 식으로 대체하며 끝에 ';'를 붙이지 않는다.
  • 매개변수는 대부분의 경우 생략할 수 있다.
  • 매개변수가 하나일 경우 괄호를 생략 가능, 그러나 매개변수 타입이 있을 때는 생략 불가능하다.
  • {} 안의 문장이 하나일 경우 {}생략 가능하며 끝에 ';'를 붙이지 않는다.


2. 함수형 인터페이스

// 람다식
(int a, int b) -> a > b ? a:b

// 익명 클래스로 위 람다식과 동일하다.
new Object() {
	int max(int a, int b){
    	return a > b ? a:b;
    }
}
  • 람다식은 익명 클래스의 객체와 동등하다.
  • 참조변수가 있어야 객체의 메서드를 호출할 수 있다.(참조변수는 클래스 혹은 인터페이스가 가능하다.)
  • 람다식을 다루기 위한 인터페이스를 '함수형 인터페이스(functional interface)'라고 한다.
// 함수형 인터페이스 MyFunction을 정의
@FunctionalInterface
interface MyFunction {
	int max(int a, int b);
}

함수형 인터페이스 타입의 매개변수와 반환타입

// 함수형 인터페이스
@FunctionalInterface
interface MyFunction {
	void myMethod();
}

// 함수형 인터페이스를 매개변수로 받아 정의된 메서드 호출
void aMethod(MyFunction f) {
	f.myMethod();
}

// 함수형 인터페이스를 반환타입으로 직접 반환
MyFunction getMyFuntion() {
	MyFunction f = () -> {};
    return f;
}
  • 람다식을 참조변수로 다룰 수 있다는 것은 메서드를 통해 람다식을 주고받을 수 있다는 것을 의미한다.
  • 사실상 메서드가 아니라 객체를 주고받는 것이여서 근본적으로 달라지는 것은 없다.
  • 그러나 코드가 더 간결하고 이해하기 쉬워진다.


3. java.util.function 패키지

  • 일반적으로 자주 쓰이는 형식의 메서드를 함수형 인터페이스로 미리 정의해놓은 패키지이다.

java.lang.Runnalbe

  • void run() - 매개변수도 없고 반환값도 없음

Supplier< T>

  • T get() - 매개변수는 없고, 반환값만 있음
  • 공급자 역할

Consumer< T>

  • void accept(T t) - 매개변수만 있고, 반환값이 없음
  • 소비자 역할
  • Supplier와 반대

Function<T,R>

  • R apply(T t) - 하나의 매개변수를 받아 결과를 반환
  • 일반적인 함수

Predicate< T>

  • boolean test(T t) - 하나의 매개변수를 받음, 반환타입은 boolean
  • 조건식을 표현하는데 사용
// Predicate 예시
Predicate<String> isEmptyStr = s -> s.length() == 0;
String s = "":

if(isEmptyStr.test(s))
	System.out.println("This is an empty String");

3-1. 매개변수가 두 개인 함수형 인터페이스

  • 매개변수의 개수가 2개인 함수형 인터페이스로 이름 앞에 접두사'Bi'가 붙는다.

BiConsumer<T,U>

  • void accept(T t, U u) - 두개의 매개변수만 있고 반환값이 없음

BiPredicate<T,U>

  • boolean test(T t, U u) - 매개변수는 둘, 반환값은 boolean
  • 조건식을 표현하는데 사용

BiFunction<T,U,R>

  • R apply<T t, U u> - 두개의 매개변수를 받아서 하나의 결과를 반환

@FunctionalInterface
interface TriFunction<T,U,V,R> {
	R apply(T t, U u, V v);
}
  • 3개 이상의 매개변수를 갖는 함수형 인터페이스가 필요할 시 위처럼 직접 만들어서 사용한다.

3-2. UnaryOperator & BinaryOperator

  • 매개변수의 타입과 반환타입의 타입이 모두 일치한다.

UnaryOperator< T>

  • T apply(T t) - 매개변수와 결과의 타입이 같다.
  • Function의 자손

BinaryOperator< T>

  • T apply(T t, T t) - 매개변수와 결과의 타입이 같다.
  • BiFunction의 자손
profile
안되면 될 때까지

0개의 댓글