@LEELEE
dev note
@LEELEE
  • 분류 전체보기 (29)
    • Project (10)
    • Study (19)
      • Java (9)
      • Spring (3)
      • Test (2)
      • DB (2)
      • Infra (1)
      • ETC (2)
      • CS (0)
    • 노트 (0)

인기 글

최근 글

태그

  • was
  • oracle
  • junit
  • Redis
  • 배포자동화
  • Leetcode
  • AWS
  • 이펙티브자바
  • DB
  • 객체지향
  • Java
  • Til
  • Spring
  • 예외처리
  • HTTP
  • transaction
  • PS
  • springboot
  • test
  • PostgreSQL
전체 방문자
오늘
어제
hELLO · Designed By 정상우.
@LEELEE

dev note

Study/Java

자바의 함수형 프로그래밍 전략, 메서드 참조

2023. 5. 4. 23:58

 

자바 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
    'Study/Java' 카테고리의 다른 글
    • Custom Exception: 검사 예외, 런타임 예외 무엇을 써야할까
    • @ExceptionHandler는 어떻게 예외를 처리할 수 있을까?
    • [Java] 제네릭
    • JVM 명세 - Run-Time Data Areas
    @LEELEE
    @LEELEE

    티스토리툴바