자바 8의 주요 컨셉은 함수형 프로그래밍 지향이다.
여기서 함수형 프로그래밍이란 함수를 일급 값으로 넘겨주도록 구현하는 것이다.
객체를 여기저기로 넘겨주며 활용하는 것처럼 메서드도 그렇게 하면 프로그램을 더 효율적으로 구현할 수 있다.
자바의 함수형 프로그래밍의 전략 중 하나로 메서드 참조가 있다.
메서드 참조는 말 그대로 객체를 참조하듯, 메서드를 참조하는 것이다.
메서드 참조의 문법은 " :: " 다.
이 메서드를 값으로 사용하라는 의미다.
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
"그래서 메서드 호출이랑 참조가 뭐가 다른 건데?"라는 질문이 생길 수 있다.
아래의 간단한 코드 예제를 보면 두 개념의 차이 그리고 자바의 지향점을 알 수 있다.
자바 8 이전
- 사과 리스트 중에서 녹색 사과나 무게가 150그램이 넘는 사과만 골라 반환하는 메서드를 구현한다
- 만약 다른 조건으로 사과를 고르고 싶으면 또 다른 메서드를 만들어야 한다
- 아래 코드의 단점은 filter 메서드를 중복으로 구현해야 한다는 점이다
public static List<Apple> filterGreenApples(List<Apple> inventory) {
List<Apple> result = new ArrayList<>();
for(Apple apple : inventory) {
if(GREEN.equals(apple.getColor())) {
result.add(apple);
}
}
return result;
}
public static List<Apple> filterHeavyApples(List<Apple> inventory) {
List<Apple> result = new ArrayList<>();
for(Apple apple : inventory) {
if(apple.getWeight() > 150) {
result.add(apple);
}
}
return result;
}
자바 8
- 조건을 메서드로 분리
- filter 메서드는 하나고 메서드를 파라미터로 받는다
- 어떤 메서드가 들어오든 해당 메서드가 골라낸 데이터가 반환한다
public static boolean isGreenApple(Apple apple) {
return GREEN.equals(apple.getColor());
}
public static boolean isHeavyApple(Apple apple) {
return apple.getWeight() > 150;
}
public interface Predicate<T> {
boolean test(T t);
}
// Predicate는 true나 false를 반환하는 함수형 인터페이스다
static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p {
List<Apple> result = new ArrayList<>();
for(Apple apple : inventory) {
if(p.test(apple)) {
result.add(apple);
}
}
return result;
}
위 filter 메서드를 사용하려면 아래처럼 isGreenApple, isHeavyApple 메서드를 파라미터로 넘겨주며 호출한다.
::를 사용하여 메서드를 참조할 수 있기에 가능한 일이다.
filterApples(inventory, Apple::isGreenApple);
filterApples(inventory, Apple::isHeavyApple);
참고
<모던 자바 인 액션>
'Study > Java' 카테고리의 다른 글
Custom Exception: 검사 예외, 런타임 예외 무엇을 써야할까 (0) | 2023.07.21 |
---|---|
@ExceptionHandler는 어떻게 예외를 처리할 수 있을까? (0) | 2023.07.20 |
[Java] 제네릭 (0) | 2023.02.01 |
JVM 명세 - Run-Time Data Areas (0) | 2022.06.25 |
자바로 간단한 http 웹 서버 구현 (0) | 2022.06.11 |