본문 바로가기
Java

함수형 인터페이스 활용

by 모스키토끼 2020. 11. 16.

함수형 인터페이스

  • 오직 하나의 메서드만 가지고 있는 인터페이스
  • 상속받은 메서드까지 포함했을 때 하나의 메서드만 가지고 있어야지만 함수형 인터페이스
  • 예시)
public interface Predicated<T> {
	bollean test(T t);
}

public interface Comparator<T> {
	int compare(T o1, T o2);
}

public interface Runnable {
	void run();
}

함수형 인터페이스 활용

→ 람다 표현식을 사용하면 함수형 인터페이스의 추상 메서드 구현을 직접 전달할 수 있다.
→ 전체 표현식을 함수형 인터페이스의 인스턴스로 취급

예시)

Runnable r1 = () -> System.out.println("hello 1");

Runnable r2 = new Runnable() [
	public void run() {
		System.out.println("Hello");
	}
}

→ r2 방법을 r1으로 대체할 수 있다.

✔️ 함수형 인터페이스의 추상 메서드 시그니처는 람다 표현식의 시그니처를 가리킨다.
함수 디스크립터: 람다 표현식의 시그니처를 서술하는 메서드

예시)
Runnable 인터페이스는 인수와 반환값이 없는 시그니처

✔️ 유효한 람다 표현식

public Callable<String> fetch() {
	return () -> "hello";
}

→ fetch 메서드의 반환형은 Callable<String>
→ Callable 추상 메서드의 제네릭 T에 String을 넣는다면 메서드의 시그니처는 () → String
→ 따라서 "hello"는 String이므로 유요한 람다 표현식

✔️@FunctionalInterface란?
함수형 인터페이스를 가리키는 어노테이션 → 어노테이션을 달고 함수형 인터페이스가 아닌 경우 컴파일 에러

실행 어라운드 패턴

자원 처리에 사용하는 순환 패턴: 자원 오픈 → 처리 → 자원 클로즈
, 즉 실제 자원을 처리하는 코드를 설정과 정리 과정이 둘러싸는 형태

초기화/ 준비 코드

작업 A, B, C ...

정리/마무리 코드

실행 어라운드 패턴을 적용하는 예시

기존 코드)

public String processFile() throws IOException {
	try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
		return br.readLine();
	}
}

1단계)

public interface BufferedReaderProcessor {
	String process(bufferedReader b) throws IOException;
}

2단계)

public String processFile(BufferedReaderProcessor p) throws IOException {
	try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
		return p.process(br);
	}
}

완성)

String oneLine = processFile((BufferedReader br) -> br.readLine());

String twoLine = processFile((BufferedReader br) -> br.readLine() + br.readLine());

stream의 중간연산에서는 함수형 인터페이스의 메서드 실행없이 그냥 구현체만 넣어두어도 실행이 가능하다.

Reference

book.naver.com/bookdb/book_detail.nhn?bid=15261103

 

모던 자바 인 액션

자바 1.0이 나온 이후 18년을 통틀어 가장 큰 변화가 자바 8 이후 이어지고 있다. 자바 8 이후 모던 자바를 이용하면 기존의 자바 코드 모두 그대로 쓸 수 있으며, 새로운 기능과 문법, 디자인 패턴

book.naver.com

 

'Java' 카테고리의 다른 글

Mockito  (0) 2020.11.16
Junit5  (0) 2020.11.16
함수형 인터페이스 모음  (0) 2020.10.08

댓글