ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 람다와 스트림 - 함수의 결합
    백엔드/자바 2021. 8. 25. 19:57

    수학에서 두 개의 함수를 결합할 수 있는 것처럼 자바에선 두 람다식을 결합할 수 있도록 하고 있다.

     

    그리고 당연히 미리 준비된 메서드만 가져다 쓰면 된다.

     

    andThen()

     

    예를 들어 위와 같은 코드가 있다고 가정해보자.

     

    참조변수 ft1은 10진수를 넣으면 2진수로 반환하는 람다식을 저장하고 있다.

     

    반면 참조변수 ft2는 2진수를 넣으면 10진수로 반환하는 람다식을 저장하고 있다.

     

    만약 이 두 개의 함수를 합치고 싶다면 어떻게 해야할까? 그럴땐 andThen을 쓰면 된다.

     

     

     

    위 코드와 같이 두 개의 함수를 andThen()메서드로 합쳐주면 두 함수는 하나로 합성된다.

     

    이때 데이터의 흐름은 "ft1 (10진수 -> 2진수) => ft2 (2진수 -> 10진수)"로 된다.

     

    그래서 정수 10을 입력하면 정수 10이 다시 나오게 된다.

     

    그렇다면 참조변수 ft1과 ft2의 위치를 바꾸면 어떨까?

     

     

     

    당연히 잘 잘동한다.

     

    그런데 자세히보면 단순히 참조변수의 위치만 바뀐 것이 아님을 확인할 수 있을것이다.

     

    잘 보면 ft3의 지네릭스 타입과 result의 타입이 바뀐 것을 확인할 수 있다.

     

    함수의 합성은 어렵지만 주의할 점이 있다.

     

    바로 매개변수와 반환 타입을 잘 맞춰줘야 한다는 것이다.

     

    그림으로 보면 더 이해하기 쉽다.

     

     

     

    위 코드의 참조변수 ft1과 ft2를 그림으로 나타낸다치면 위 그림과 같을 것이다.

     

    코드에서 보듯 두 함수를 합치면 어느 함수가 앞에 오든 결과가 일정한 것을 알 수 있다.

     

     

     

    그 이유는 바로 위 그림처럼 서로의 매개변수 타입과 반환값의 타입이 잘 맞물리기 때문이다.

     

    만약 ft1의 반환타입이 String이 아니라 Integer였다면?

     

    ft1과 ft2의 결합은 양방향이 아닌 단방향으로만 가능했을 것이다.

     

    조금만 생각해도 쉽게 알 수 있는 문제이므로 함수를 합성하기 전에 생각하고 진행하면 좋다.

     

    compose()

     

    위 코드에서 ft4를 보면 이전 단락과 달리 ft1이 앞에 오고 ft2가 뒤에 오는 식으로 함수를 결합했는데

     

    결과가 ft4의 결과가 ft3와 다른 것을 알 수 있다.

     

    이는 compose() 메서드는 andThen() 메서드와 계산 방향이 반대이기 때문이다.

     

    andThen()은 앞의 메서드를 먼저 계산하고 그 반환값이 뒤의 메서드의 매개변수로 전달된다.

     

    반면 compose는 뒤의 메서드를 먼저 계산하고 그 반환값이 뒤의 메서드의 매개변수로 전달된다.

     

    즉 andThen()이 정방향 계산이라면, compose()는 역방향 계산이라고 생각하면 쉽다.

Designed by Tistory.