실행 어라운드 패턴

반응형
728x90
반응형

함수 디스크립터

함수형 인터페이스의 추상 메서드 시그니처 = 람다 표현식의 시그니처 이다. 람다 표현식의 시그니처를 서술하는 메서드를 함수 디스크립터라고 부른다. 여기서 메서드 시그니처란, 메서드명/파라미터 순서/파라미터 타입/파라미터 개수를 의미한다.

 

왜 함수형 인터페이스를 인수로 받는 메서드에만 람다 표현식을 사용할 수 있을까?

  • 언어 설계자들은 언어를 더 복잡하게 만들지 않는 방법을 선택했다.
  • 대부분의 자바 프로그래머가 하나의 추상 메서드를 갖는 인터페이스에 이미 익숙하다.

 

 

@FunctionalInterface

함수형 인터페이스에 @FunctionalInterface 어노테이션이 추가되었다. 해당 어노테이션을 선언하면 인터페이스가 함수형 인터페이스가 아니라면 컴파일 에러가 발생한다. 함수형 인터페이스는 추상 메서드가 1개여야하는데, 추상 메서드가 1개 이상이라면 에러가 발생한다.

 

 

 

 

실행 어라운드 패턴

실제 자원을 처리하는 코드를 설정과 정리 두 과정이 둘러싸는 형태를 갖는다. 쉽게 말하자면, 하나의 로직을 수행할때 첫번째로 초기화/준비 코드가 수행되고 마지막에 정리/마무리 코드가 실행된다. 그리고 그 사이에 실제 자원을 처리하는 코드를 실행하는 것이다.

 

실행 어라운트 패턴을 적용하는 과정을 알아보자.

 

(1) 실행 어라운트 패턴의 구현

public String processFile() throw IOException {
    try (
      BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
      return br.readLine(); // 실제 작업을 수행
    }
}

 

(2) 동작 파라미터화

위 (1)번 코드에서는 파일의 한줄씩 읽어들인다. 만약 파일을 한번에 두줄을 읽으려면 (실제 작업을 수정하려면) 기존의 설정/정리 과정은 재사용하고 실제 작업을 수행하는 한 줄의 코드만 수정하면 된다. 우리는 processFile의 동작을 파라미터화 시킬 수 있다.

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

 

(3) 함수형 인터페이스

@FunctionalInterface
public interface BufferedReaderProcessor {
  String process(BufferedReader b) throws IOExeption;
}

// 위 함수형 인터페이스를 processFile 메서드의 인수로 전달한다.
public String processFile(BufferedReaderProcessor p) throws IOException {
  ...
}

 

(4) 동작 실행
람다 표현식으로 함수형 인터페이스의 추상 메서드 구현을 직접 전달할 수 있으며, 전달된 코드는 함수형 인터페이스의 인스턴스로 전달된 코드와 같은 방식으로 처리한다.

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

 

(5) 람다 전달
이제 람다를 사용해서 다양한 동작을 processFile 메서드로 전달할 수 있다.

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

 

반응형

'Coding > Java' 카테고리의 다른 글

함수형 인터페이스 사용  (0) 2020.11.06
빌더 패턴의 권장 이유  (0) 2020.11.06
람다표현식에 대해 알아보기  (0) 2020.11.06
java8의 LocalDateTime 클래스 날짜시간  (0) 2020.11.06
자바 8의 Optional 등장  (0) 2020.11.06

Designed by JB FACTORY