함수형 인터페이스

Jan 30, 2024
함수형 인터페이스

1. 함수형 인터페이스란?

하나의 추상 메서드를 가지는 인터페이스 람다 표현식을 사용하여 인터페이스의 추상 메서드를 구현할 수 있다.
💡
람다 표현식과 함께 많이 사용 됨. 람다 표현식은 함수형 인터페이스의 구현을 간단하고 간결하게 작성할 수 있는 방법
 

[ 함수형 인터페이스의 종류 ]

1. Function 인터페이스란?

자바에서 제공하는 함수형 인터페이스 Function 인터페이스는 입력값을 받아서 결과값을 반환하는 함수를 표현하기 위해 사용한다. 일반적으로 제네릭 타입을 사용하여 입력값과 결과값의 타입을 지정할 수 있다. ( = 매개변수의 타입과 반환 타입이 정해져 있지 않다.)
💡
제네릭 타입 매개변수에는 참조 타입만 사용할 수 있기 때문에 Function은 랩핑으로만 넣을 수 있다. (int → Integer / double → Double)
 

2. Function 인터페이스의 형태

notion image
//map()은 Function 인터페이스를 활용하는 메서드 중 하나

[ 일반적인 형태 ]
interface Able { void hello(int value); }
 
[ Function 인터페이스로 구현한 형태 ]
interface Able<T, R> { R hello(T value); } ----------------------------------------- interface Able { void hello(int value); } public class Main { public static void main(String[] args) { Function<Integer, Void> function = (value) -> { System.out.println("Hello, " + value); return null; }; Able able = function::apply; able.hello(123); } }
notion image
만약, value에다 숫자를 넣으면 T는 Integer타입이 된다. R = 리턴을 나타내고, 마찬가지로 Integer를 넣으면 Integer타입. Function 인터페이스는 매개변수의 타입과 리턴 타입이 정해져있지 않다. 호출하고, 리턴할 때 결정됨.
 

3. 예제

notion image
notion image
1,2,3,4 는 처음엔 int로 받았지만 List 타입(컬렉션)으로 변경됐기 때문에 람다할 때 Integer 로 랩핑해서 받는다.
Arrays.asList() 메서드로 생성된 리스트는 고정 크기의 리스트로, 값의 추가나 삭제가 불가능 * 컬렉션 타입 -> 원시 자료형은 모두 랩핑해서 받는다. Arrays.asList() = 배열을 List 타입으로 받아라.
 

<해당 부분은 람다에서 return void하는 그걸 보고오기>

notion image
notion image
i = Integer (다 치기 번거로워서 한글자로 줄여서 작성)
💡
toList() 메소드는 스트림(Stream)을 리스트(List)로 변환하는 메소드 asList()는 배열을 List로 변환!
 

 
💡
[자바] list.stream() == [자바 스크립트] ... (전개 연산자) 흩뿌려지는 것 = 타입을 벗긴 것 = 현재 타입이 없는 형태
notion image
 

4. 컬렉션 복사

[ 처음에 Arrays.asList(1,2,3,4); 로 하는 법 ]
public class CopyEx01 { public static void main(String[] args) { var list = Arrays.asList(1,2,3,4); // 컬렉션 복사 List<Integer> newList = new ArrayList<>(list); newList.add(5); System.out.println(newList); System.out.println(list.size()); System.out.println(newList.size()); System.out.println(list.hashCode()); System.out.println(newList.hashCode());
notion image
 

 
[ 처음에 List<Integer> list = new ArrayList<>(); 로 하는 법 ]
public class CopyEx01 { public static void main(String[] args) { List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); // 컬렉션 복사 List<Integer> newList = new ArrayList<>(list); newList.add(5); System.out.println(newList); System.out.println(list.size()); System.out.println(newList.size()); System.out.println(list.hashCode()); System.out.println(newList.hashCode());
notion image
 

1. Predicate 인터페이스

단일 인자를 받아서 boolean 값을 반환하는 메서드를 정의하는 함수형 인터페이스 조건을 만족하면 true를 반환하고, 만족하지 않으면 false를 반환 주로 조건을 검사하거나 필터링하는데 사용
notion image
💡
Predicate 인터페이스를 사용하여 null이 아닌 값을 검사하는 람다 표현식 (제네릭 타입을 명시하지 않았으므로, Object 타입의 값을 검사)
notion image
 

[ 예시 ]
notion image
하나의 추상 메서드 test 있는 것 확인! -> 함수형 인터페이스
notion image
return str.length() > 5;는 test 메서드의 구현부분 주어진 문자열 str의 길이가 5보다 큰지를 검사하는 로직 만약 str의 길이가 5보다 크다면, true를 반환하고 그렇지 않다면 false를 반환 >> 이걸 람다식으로 사용
 

2. Supplier 인터페이스

매개변수가 없고, 값을 반환하는 메서드를 가진 함수형 인터페이스 * 값을 생성하는 로직을 담고 있는 메서드를 표현하고 싶을 때 사용 * 매개변수가 없고, 값을 반환하는 람다 표현식을 사용하고자 할 때 사용
notion image
notion image
매개변수 없고, 리턴 있고
notion image
 

3. Consumer 인터페이스

단일 매개변수를 받아서 그 값을 어떤 방식으로든 처리(소비)하는 동작을 구현 (값 반환 X) * 어떤 작업을 수행하고자 할 때, 인자를 받아서 처리하는 로직을 구현할 때 사용 * 컬렉션의 요소에 대해 특정 동작을 수행하기 위해 사용 ex) 리스트의 모든 요소에 대해 특정 연산을 수행할 때
notion image
notion image
💡
소비하다 = 해당 값을 활용하여 원하는 동작을 수행하는 것을 의미
💡
입력값을 받아서 어떠한 동작을 수행하고 반환하지 않는 accept 메서드
 

 
Consumer<String> 타입의 객체를 생성한다고 가정해보자. 이 객체는 문자열을 입력받아서 그 값을 활용하여 원하는 동작을 수행한다. 이 동작은 accept 메서드를 통해 정의된다.
notion image
notion image
//람다로 변형
Consumer<String> 타입의 printString 객체를 생성하고, 입력받은 문자열을 출력하는 동작을 accept 메서드의 구현부인 System.out.println(text)로 정의하고 있다. 이제 printString 객체를 사용하여 다음과 같이 문자열을 출력할 수 있다.
notion image
"안녕하세요"를 매개변수 (받는 변수명 : text) 로 받아서 "안녕하세요" -> System.out.println("안녕하세요"); 형식으로 동작하게 하는 것이 '소비', Consumer 인터페이스 이렇게 값(인자)을 받아서 그 값을 활용하여 원하는 동작을 수행하는 역할을 한다.
 
💡
이것 외에도 ActionListener, Comparator 등 많다.
 
Share article

codingb