30일차 - 람다식(2)
안녕하세요. pitang입니다.
저번 시간에 이어 람다식을 더 알아보도록 하겠습니다.
함수적 인터페이스
람다식이 하나의 메서드를 정의하기 때문에
두 개 이상의 추상 메서드가 선언된 인터페이스는 람다식을 이용해서 구현 객체를 생성할 수 없다.
하나의 추상 메서드가 선언된 인터페이스만이 람다식의 타깃 타입이 될 수 있는데 이러한 인터페이스를 함수적 인터페이스라고 한다.
표준 API의 함수적 인터페이스
자바에서 제공되는 표준 API에서 한 개의 추상 메서드를 가지는 인터페이스들은 모두 람다식을 이용해 익명 구현 객체로 표현이 가능하다.
java.util.function 패키지의 함수적 인터페이스는 크게 Consumer, Supplier, Function, Operator, Predicate로 구분된다.
Consumer | 매개값 o, 리턴값 x |
Supplier | 매개값 x, 리턴값 o |
Function | 매개값 o, 리턴값 o |
Operator | 매개값 o, 리턴값 o |
Predicate | 매개값 o, 리턴 타입 boolean |
자바 API를 살펴볼 때 이 표를 기억하면 사용하기 편할 것이지만, 검색하는 것을 두려워하지 말자.
Consumer 함수적 인터페이스
Consumer 함수적 인터페이스의 특징은 리턴값이 없는 accept() 메서드를 가지고 있다.
List 컬렉션을 사용하며 더 알아보자.
ex1)
자바 API에서 ArrayList, forEach를 찾아보면,
이다.
Consumer<T> | void accept(T t) | 객체 T를 받아 소비 |
원래 향상된 for문으로 출력을 했었는데, forEach()를 사용하면 람다식으로 한줄로 코드를 작성할 수 있다.
ex2)
자바 API에서 HashMap, forEach를 찾아보면,
이다.
BiConsumer<T, U> | void accept(T t, U u) | 객체 T와 U를 받아 소비 |
Function 함수적 인터페이스
Function 함수적 인터페이스의 특징은 매개값과 리턴값이 있는 applyXXX() 메서드를 가지고 잇다.
ex1)
자바 API에서 HashMap, compute를 찾아보면,
이다.
BiFunction<T, U, R> | R apply(T t, U u) | 객체 T와 U를 객체 R로 매핑 |
ex2)
자바 API에서 Hashmap, replaceall을 찾아보면
이다.
Predicate 함수적 인터페이스
Predicate 함수적 인터페이스는 매개 변수와 boolean 리턴값이 있는 textXXX() 메서드를 가지고 있다.
이 메서드들은 매개값을 조사해서 true 또는 false를 리턴하는 역할을 한다.
ex)
자바 API에서 ArrayList, removeif를 찾아보면,
이다.
Predicate<T> | boolean test(T t) | 객체 T를 조사 |
Operator 함수적 인터페이스
Operator 함수적 인터페이스는 Function과 동일하게 매개 변수와 리턴값이 있는 applyXXX() 메서드를 가지고 있다.
하지만 이 메서드들은 매개값을 리턴값으로 매핑하는 역할보다는
매개값을 이용해서 연산을 수행한 후 동일한 타입으로 리턴값을 제공하는 역할을 한다.
ex)
자바에서 Arraylist, replaceAll을 찾아보면
이다.
로컬 변수 사용
람다식은 메서드 내부에서 주로 작성되기 때문에 로컬 익명 구현 객체를 생성시킨다고 봐야 한다.
람다식에서 바깥 클래스의 필드나 메서드는 제한 없이 사용할 수 있으나,
메서드의 매개 변수 또는 로컬 변수를 사용하면 이 두 변수는 final 특성을 가져야 한다.
따라서, 매개 변수 또는 로컬 변수를 람다식에서 읽는 것은 허용되지만,
람다식 내부 또는 외부에서 변경할 수 없다.
ex)
감사합니다.
*m1 맥북을 사용 중입니다.*