리액티브 프로그래밍을 위한 사전지식

22·2024년 4월 13일

Spring

목록 보기
4/5

함수형 프로그래밍 ?

  • java8부터 람다 표현식이 도입되면서 함수형 프로그래밍 기법을 사용할 수 있게 되었다.

함수형 인터페이스 Functional Interface

  • 기존 인터페이스와 달리 단 하나의 추상 메서드만 정의되어 있다.
    왜 이름을 굳이 함수형 인터페이스라고 부를까?
  • 함수형 프로그래밍 세계에서는 함수를 값으로 취급한다. 즉, 어떤 함수를 호출할 때 함수 자체를 파라미터를 전달 할 수 있다.
Collections.sort(cryptoCurrencies, new Comparator<CryptoCurrency>() {
            @Override
            public int compare(CryptoCurrency o1, CryptoCurrency o2) {
                return o1.getUnit().name().compareTo(o2.getUnit().name());
            }
        });

-> 함수형 인터페이스인 Comperator를 사용..

Comperator 인터페이스는 default 메서드가 여러개 있지만 추상 메서드 하나만 정의되어 있으므로 함수형 인터페이스이다.
@FunctionalInterface 어노테이션으로 명시적으로 지정되어있다.

그런데, 인터페이스 자체를 익명 구현객체로 전달하는 방식이 코드자체가 너무 길어서 지저분하게 보인다.
-> 람다 표현식을 사용한다.

람다 표현식

  • javascript 의 화살표 함수와 비슷한 형태로 java 에서 함수를 값으로 취급하기 위해 생겨난 간결한 형태의 표현식이다.
    (String a, String b) -> a.equals(b)
    -> 람다 파라미터 -> 화살표 -> 람다 body
  • 람다 표현식은 단 하나의 추상메서드를 가지는 인터페이스, 즉 함수형 인터페이스를 구현한 클래스의 메서드 구현을 단순화한 표현식이다.
    람다파라미터 : 함수형 인터페이스에 정의된 추상 메서드의 파라미터
    람다 body : 추상 메서드에서 구현되는 메서드 body
  Collections.sort(cryptoCurrencies, (o1, o2) -> o1.getUnit().name().compareTo(o2.getUnit().name()));
  • 위에 보다 훨씬 깔끔하다!!

헷갈리면 안될 것!

  • 함수형 인터페이스의 추상 메서드를 람다 표현식으로 작성해서 메서드의 파라미터로 전달한다.

  • 이 말의 의미는 "메서드 자체를 파라미터로 전달하는 것" 이 아니다. 바로, 함수형 인터페이스를 구현한 클래스의 인스턴스를 람다 표현식으로 작성해서 전달하는 것람다 표현식은 함수형 인터페이스를 구현한 클래스의 객체이다!

  • 람다표현식은 외부에서 정의된 변수도 사용할 수 있다. as 람다 캡처링


메서드 레퍼런스

  • 람다표현식 보다 좀 더 간결하게 함수형 인터페이스를 작성할 수 있다.

  • 메서드의 이름만 사용하여 메서드 레퍼런스를 표현합니다.

    (Car car) -> car.getCarName() = Car::getCarName

함수 디스크립터

  • 함수 디스크립터란 일반화된 람다 표현식을 통해서 이 함수형 인터페이스가 어떤 파라미터를 가지고, 어떤 값을 리턴하는지 설명해주는 역할을 한다.

  • Predicate : 서술하다, 단정하다. 파라미터가 조건을 만족하는지 검사한다는 의미이다.

    • T -> boolean : T 타입의 람다 파라미터와 boolean 타입의 값을 리턴.
  • Consumer : 리턴값이 없고 데이터를 소비한다라는 의미

    • T -> void. : T타입의 파라미터가 있고 리턴값은 없다. 일정 작업을 수행한 후 결과 값을 리턴할 필요가 없는 경우, 사용(배치)
  • Function<T,R> : 함수 내에서 어떤 처리 과정을 거친 후에 그 결과로 특정 타입의 값을 반환한다.

    • T -> R : T 타입의 파라미터를 가지며, R 타입을 리턴한다.
  • Supplier : 어떤 값이 필요할 때 데이터를 제공하는 용도로 사용한다. 즉, 어떤 데이터를 제공할지에 대한 동작을 정의한다.

    • () -> T : 추상 메서드가 파라미터를 갖지 않으며 리턴으로 T타입의 값만 리턴한다.

    Ref 스프링으로 시작하는 리액티브 프로그래밍 챕터4

0개의 댓글