모던 자바 인 액션 19장

함수는 모든 곳에 존재한다

19장의 내용은 함수형 프로그래밍의 각종 기법을 배우는 장이다.

일단 함수형 프로그래밍이라는 것은, ‘함수를 일반 값처럼 사용해서 인수로 전달하거나, 결과로 반환받거나, 자료구조에 저장할 수 있음’ 을 의미한다. 그리고 이 때 사용하는 함수를 우리는 ‘일급 함수’ 라고 한다.

  • 함수형 프로그래밍 -> 일급 함수를 제대로, 잘 사용하는 프로그래밍

뭐…예를 들어 이런거다

메소드 참조로 함수를 변수처럼 ㅇㅇ

함수값을 스트림으로 처리하거나, 함수를 arg로 받아서 다른 함수로 반환하는 static method 같은것도 있다.

뭐 이런거….ㅇㅇ

저런 Comparator.comparing같이

  • 하나 이상의 함수를 arg로 받음
  • 결과값으로 ‘함수’를 반환

하는 동작을 가지는 함수를 ‘고차원 함수’ 라고 한다.

고차원 함수와 부작용

고차원함수의 정의 중 하나인 ‘하나 이상의 함수를 arg로 받음’ 을 보면 유추할 수 있듯이, 고차원함수를 구현할 때 ‘무슨 arg가 들어올 지 모른다’ 떄문에 부작용이 발생할 수 있다. 일반적인 변수값이야 동작이 아니라 부작용을 없앨 수 있지만……
따라서 arg로 전달된 함수가 어떤 부작용을 포함하게 될 지에 대해 정확하게 문서화 하는 것이 좋다.

뭐…. 예를 들어…. 어떤 고차원 함수 A에 arg를 ‘나누기’로 받는다 할 때, 분모가 0인 값으로 나누기가 수행되게끔 실행된다면 고차원 함수에서 부작용이 일어나게 될 것이다.(부작용의 원인이 고차원 함수가 아니라 arg로 받는 ‘나누기’에 존재함에도 불구하고!)

커링

x,y라는 두 인수를 받는 함수 f를….. g라는 함수로 대체하는 기법이다.

f(x,y) == (g(x)(y)) (외우자……….)

프로그래밍에서의 커링의 개념은 간단하다. 섭씨를 화씨로 변환하는 공식은 다음과 같다

Celcius to Farenheit

요걸 다음과 같이 함수화 할 수 있다.

이거야!!!! 이건…..가?

근데 이 converter메소드는 재활용이 안된다. 그래서 이 일반적인 방법이 아니라, 커링이라는 개념을 활용해서… ‘arg로 함수를 받는’ 고차원 함수로 작성하면 다음과 같이 작성할 수 있다. 만든 함수는 팩토리 타입의 함수이다.

하나 이상의 함수를 arg로 받고, 리턴타입 또한 함수..

그리고 이 curriedConverter 를 사용하는 어플리케이션 코드는

컨버팅 로직을 재활용

이렇게 거의 모든 단위 변환을 재활용 할 수 있다.

파괴적인 갱신

A –> B로 기차여행을 의미하는 클래스가 있다고 하자.

TrainJourney 클래스에는 onward라는 ‘다음 여정’ 을 의미하는 필드가 있다.

그리고 X -> Y… 그리고 Y -> Z 로의 여행을 나타내는 별도의 TrainJourney타입의 인스턴스가 있다고 하자. 그리고 이 두개의 경로를 이어 X -> Y -> Z 로의 여행을 표현하고자, ‘연결’의 의미를 갖는 link라는 메소드를 만들어 본다.

음….

이 코드에서 문제는, 기존 X-> Y 로의 경로(firstJourney) 와 Y -> Z로의 경로(secondJourney) 를 연결하는데, firstJourney 인스턴스에 ‘파괴적인 갱신’이 일어난다….

개념적으로 X -> Y -> Z 를 표현해야 하는 인스턴스의 구조가, 그냥 X -> Z로 변경되어버리는 문제가 발생한다.(부작용이 생긴다.)

이런 경우를 대비해, 우리는 다음과 같이 firstJourney를 별도로 복사해서 처리하는 방식으로 코드를 작성하는 습관을 들여야 한다.

트리 예제

binary search tree 의 예를 들어보자.

기존 값을 업데이트 하는 메소드를 만든다

문제가 있다

이 메소드에는 위의 파괴적인 갱신과 마찬가지로, 원본 자료구조가 망가지는 문제를 갖고 있다. 원본 자료구조가 망가지는 문제에 대해서는 굳이 설명하지 않겠다…ㅋㅋ

그래서 이런 경우는 다음과 같이 함수형 접근법을 통해 fupdate메소드를 만들면 된다.

어썸 굿 잡 브릴리언트 잡

fupdate메소드를 통해 트리에 값을 추가(변경/삭제) 할 경우 다음과 같은 구조로 자료구조가 만들어진다.

Leave a Comment