(자바 8) 실행 어라운드 패턴.
자원처리 (예를들면 데이터베이스의 파일처리)에 사용하는 순환패턴은 자원을 열고, 처리한 다음에, 자원을 닫는 순서로 이루어진다.
설정과 정리과정은 대부분 비슷하다.
즉, 실제자원을 처리하는 과정은 설정과 정리 두 과정이 둘러싼 형태를 갖는다.
예를들어) 작업 A, 작업 B를 한다치면
1. 초기화/준비코드 -> 작업 A -> 정리/마무리코드
2. 초기화/준비코드 -> 작업 B -> 정리/마무리코드
즉, 이러한 것을 실행어라운드 패턴이라 부른다.
그러나 작업 A, 작업 B를 실행하기 위해서는 위와같이 중복되는 준비 코드와 정리코드가 발생한다.
이를 줄이기 위한 것이다.
이 패턴은 총 4단계를 거친다.
1단계 : 동작파라미터화를 기억하라.
2단계 : 함수형 인터페이스를 이용해서 동작 전달
3단계 : 동작 실행!
4단계 : 람다 전달
public static String processFile() throws IOException{
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
return br.readLine();
}
}
1단계 : 동작파라미터화를 기억하라.
-> 위 코드는 파일에서 한 번에 한 줄만 읽을 수 있다. 만약 한 번에 두 줄을 읽거나 가장 자주 사용되는 단어를 반환하려면 어떻게 해야 할까?
processFile의 동작을 파라미터화하는 것이다. 람다를 이용해서 동작을 전달할 수 있다.
String result = processFile((BufferedReader br) -> br.readLine() + br.readLine());
2단계 : 함수형 인터페이스를 이용해서 동작 전달
함수형 인터페이스 자리에 람다를 사용할 수 있다.
따라서 BufferedReader -> String 과 IOException을 던질 수 있는 시그너처와 일치하는 함수형 인터페이스를 만들어야 한다.
@FunctionalInterface
public interface BufferedReaderProcessor{
String process(BufferedReader b) throws IOException;
}
정의한 인터페이스를 processFile 메서드의 인수로 전달할 수 있다.
public static String processFile(BufferdReaderProcessor p) throws IOException{
.....
}
3단계 : 동작 실행!
이제 BufferedReaderProcessor에 정의된 process 메소드의 시그너처(BufferedReader -> String)와 일치하는 람다를 전달할 수 있다.
public static String processFile(BufferedReaderProcessor p) throws IOException{
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
return p.process(br);
}
}
4단계 : 람다 전달
람다를 이용해서 다양한 동작을 processFile 메소드로 전달할 수 있다.
String oneLine = processFile((BufferedReader br) -> br.readLine());
String twoLine = processFile((BufferedReader br) -> br.readLine() + br.readLine());
설정과 정리과정은 대부분 비슷하다.
즉, 실제자원을 처리하는 과정은 설정과 정리 두 과정이 둘러싼 형태를 갖는다.
예를들어) 작업 A, 작업 B를 한다치면
1. 초기화/준비코드 -> 작업 A -> 정리/마무리코드
2. 초기화/준비코드 -> 작업 B -> 정리/마무리코드
즉, 이러한 것을 실행어라운드 패턴이라 부른다.
그러나 작업 A, 작업 B를 실행하기 위해서는 위와같이 중복되는 준비 코드와 정리코드가 발생한다.
이를 줄이기 위한 것이다.
이 패턴은 총 4단계를 거친다.
1단계 : 동작파라미터화를 기억하라.
2단계 : 함수형 인터페이스를 이용해서 동작 전달
3단계 : 동작 실행!
4단계 : 람다 전달
public static String processFile() throws IOException{
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
return br.readLine();
}
}
1단계 : 동작파라미터화를 기억하라.
-> 위 코드는 파일에서 한 번에 한 줄만 읽을 수 있다. 만약 한 번에 두 줄을 읽거나 가장 자주 사용되는 단어를 반환하려면 어떻게 해야 할까?
processFile의 동작을 파라미터화하는 것이다. 람다를 이용해서 동작을 전달할 수 있다.
String result = processFile((BufferedReader br) -> br.readLine() + br.readLine());
2단계 : 함수형 인터페이스를 이용해서 동작 전달
함수형 인터페이스 자리에 람다를 사용할 수 있다.
따라서 BufferedReader -> String 과 IOException을 던질 수 있는 시그너처와 일치하는 함수형 인터페이스를 만들어야 한다.
@FunctionalInterface
public interface BufferedReaderProcessor{
String process(BufferedReader b) throws IOException;
}
정의한 인터페이스를 processFile 메서드의 인수로 전달할 수 있다.
public static String processFile(BufferdReaderProcessor p) throws IOException{
.....
}
3단계 : 동작 실행!
이제 BufferedReaderProcessor에 정의된 process 메소드의 시그너처(BufferedReader -> String)와 일치하는 람다를 전달할 수 있다.
public static String processFile(BufferedReaderProcessor p) throws IOException{
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))){
return p.process(br);
}
}
4단계 : 람다 전달
람다를 이용해서 다양한 동작을 processFile 메소드로 전달할 수 있다.
String oneLine = processFile((BufferedReader br) -> br.readLine());
String twoLine = processFile((BufferedReader br) -> br.readLine() + br.readLine());
댓글
댓글 쓰기