/////
Search
Duplicate
3️⃣

람다 활용 : 실행 어라운드 패턴

: 람다와 동작 파라미터화로 유연하고 간결한 코드를 구현하는 데 도움을 주는 실용적인 예제를 살펴보자.
: 자원 처리에 사용하는 순환 패턴은 자원을 열고, 처리한 다음에, 자원을 닫는 순서로 이루어진다. 즉, 실제 자원을 처리하는 코드를 설정과 정리 두 과정이 둘러싸는 형태를 갖는다.
: 다음은 예제 코드로 굵은 글씨가 파일에서 한 행을 읽어오는 코드다.
public String processFile() throws IOException { try (BuffeterdReader br = new BufferedReader(new FileReader("data.txt"))) { return br.readLine(); // 실제 필요한 작업을 수행하는 행 } }
Java
복사

1. 1단계 : 동작 파라미터화를 기억하라

: 현재 코드는 파일에서 한 번에 한 줄만 읽을 수 있다. 한 번에 두 줄을 읽거나 가장 자주 사용되는 단어를 반환하려면? 어떻게 해야 할까
: 기존의 설정, 정리 과정은 재사용하고 processFile 메서드만 다른 동작을 수행하도록 명령할 수 있다면 좋을 것이다.
: 그렇다. processFile의 동작을 파라미터화하는 것이다. processFile 메서드가 BufferReader를 이용해서 다른 동작을 수행할 수 있도록 processFile 메서드로 동작을 전달해야 한다.
: 이또한 람다를 이용해서 동작을 전달할 수 있다. processFile 메서드가 한 번에 두 행을 읽게 하려면 우선 BufferedReader를 인수로 받아서 String을 반환하는 람다가 필요하다.
String result = processFile((BufferedReader br) -> br.readLine() + br.readLine());
Java
복사

2. 2단계 : 함수형 인터페이스를 이용해서 동작 전달

: 함수형 인터페이스 자리에 람다를 사용할 수 있다. 따라서 BufferedReader → String과 IOException을 던질 수 있는 시그니처와 일치하는 함수형 인터페이스를 정의해야 한다.
: 이 인터페이스를 BufferedReaderProcessor라고 정의하자.
@FunctionalInterface public interface BufferedReaderProcessor { String process(BufferedReader b) throws IOException; }
Java
복사
: 정의한 인터페이스를 processFile 메서드의 인수로 전달할 수 있다.
public String processFile(BufferedReaderProcessor p) throws IOException { ... }
Java
복사

3. 3단계 : 동작 실행

: 이제 BufferedReaderProcessor에 정의된 process 메서드의 시그니처와 일치하는 람다를 파라미터로 전달할 수 있다.
public String processFile(BufferedReaderProcessor p) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) { return p.process(br); } }
Java
복사

4. 4단계 : 람다 전달

: 람다를 이용하여 다양한 동작을 processFile 메서드에 전달할 수 있다.
String oneLine = processFile((BufferedReader br) -> br.readLine()); String twoLine = processFile((BufferedReader br) -> br.readLine() + br.readLine());
Java
복사

실행 어라운드 패턴을 적용하는 네 단계의 과정

public String processFile() throws IOException { try (BuffeterdReader br = new BufferedReader(new FileReader("data.txt"))) { return br.readLine(); } }
Java
복사
⇒ 초기 함수의 형태이다. 여기서 return br.readLine(); 이부분을 수정할 것이다.
public interface BufferedReaderProcessor { String process(BufferedReader b) throws IOException; } public String processFile(BufferedReaderProcessor p) throws IOException { ... }
Java
복사
⇒ 실행 앞뒤로 정의된 설정과 정리를 제외하고 실행을 파라미터화한다.
public String processFile(BufferedReaderProcessor p) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) { return p.process(br); } }
Java
복사
⇒ processFile도 파라미터화한 결과에 대해 사용법을 수정해주어야 한다!
String oneLine = processFile((BufferedReader br) -> br.readLine()); String twoLine = processFile((BufferedReader br) -> br.readLine() + br.readLine());
Java
복사
⇒ 이렇게 하나의 메서드로 한 줄을, 두 줄을 읽게하는 동작이 가능하다.