지난 포스팅에서는 람다의 개념을 알아보았다. 이번 포스팅에서는 람다가 활용되는 예를 알아보겠다.
람다가 활용되는 대표적인 예는 '실행 어라운드 패턴'이다.
실행어라운드패턴
파일처리는 자원을 열고(OPEN) 자원을 처리하고(PROCESS) 자원을 닫는 과정(CLOSE)을 반복한다. 이를 순환패턴이라 한다. 그렇다면 파일을 처리하는 코드는 자원을 설정(SetUp)하고 자원을 처리(Process)하고 자원을 정리(CleanUp) 하는데 이를 실행어라운드 패턴이라 부른다.
SetUp과 CleanUp의 코드는 보통 동일하다. 그러나 Process 코드는 언제든 요구사항에 따라 변경가능하다. 그렇다면 실행어라운드패턴에서 Process 코드는 언제든 변경가능해야 하므로 코드를 파라미터로 넘겨주어야 한다.
코드를 통해 살펴보자.
public String processfile() throws IOException {
// try-with-resourcs 구문 : BufferedReader 생성 및 종료를 자동으로 해주는 구문 ( AutoCloseable 인터페이스의 구현체 )
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){ // SetUp 및 CleanUp
return br.readLine(); // Process
}
}
processfile 메소드는 try-with-resources 구문(java7이상)을 사용하였다. try 괄호 안에 Open 및 Close할 자원을 명시하고 중괄호 안에는 Process 로직을 넣는다.
위 코드는 요구사항 변경에 대응하지 못한다.
현 로직은 txt 파일을 한 줄만 읽는다. 그러나 요구사항은 두 줄, 세 줄 읽기로 언제든 변경가능하다. 그러므로 이를 실행어라운드패턴을 활용하여 변화에 대응가능한 코드로 만들어야 한다.
실행어라운드패턴 구현
1. 함수형 인터페이스 생성
@FunctionalInterface // 함수형 인터페이스 생성
public interface BufferedReaderProcessor {
String process(BufferedReader bufferedReader) throws IOException;
}
추상메소드를 단 하나만 갖는 함수형 인터페이스를 생성해준다. 람다는 파라미터로 '코드'를 넘기는 기술로 '코드'를 담을 '그릇'이 필요한데 함수형 인터페이스가 그 역할을 한다.
2. 함수형 인터페이스 파라미터로 넣기
public String processfile(BufferedReaderProcessor brp) throws IOException {
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){ //SetUp & CleanUp
return brp.process(br); // Process
}
}
자원을 처리하는 메소드(processfile 메소드)에 Process 코드를 넘겨주는 함수형 인터페이스를 파라미터로 받는다. 이러면 processfile 메소드는 변화에 대응 가능한 코드가 된다. Process 로직이 변경되면 BufferedReaderProcessor의 구현객체를 람다를 사용하여 파라미터로 넘겨주면 된다.
3. 람다 사용하여 파라미터 넘기기
public static void main(String[] args) throws IOException {
FileProcessor fileProcessor = new FileProcessor();
fileProcessor.processfile((BufferedReader br) -> br.readLine()); // 1줄 읽기
fileProcessor.processfile((BufferedReader br) -> br.readLine() + br.readLine()); // 2줄 읽기
}
람다는 람다표현식을 사용하여 함수형 인터페이스의 추상메소드를 묘사한 구현객체를 생성하여 반환하여 파라미터로 넘긴다. 이렇게 언제든 변화 가능한 Process 코드를 파라미터로 분리하여 언제든 대응가능 하도록 구성한 패턴이 바로, 실행어라운드 패턴이다.
그리고 실행 어라운드 패턴에서 코드를 넘길 때, 사용되는 기술이 람다(Lambda)이다.
참고자료
'JAVA > Modern JAVA' 카테고리의 다른 글
[MODERN JAVA] 컴파일러가 보는 람다(Lambda) (0) | 2023.06.01 |
---|---|
[MODERN JAVA] 람다(Lambda)의 활용 - Predicate, Consumer, Function (0) | 2023.03.15 |
[MODERN JAVA] 람다(Lambda)란? (0) | 2023.02.14 |
[MODERN JAVA] 동작 파라미터화 - Comparator,Runnable,Callable (1) | 2023.01.25 |
[MODERN JAVA] 동작 파라미터화 - 익명 클래스(Anonymous Class) (0) | 2023.01.16 |