모던 자바 인 액션 19장 : 함수형 프로그래밍 기법

Adam·2024년 7월 19일
0

모던 자바 인 액션

목록 보기
18/20

함수는 모든 곳에 존재한다

일급함수: 일반값처럼 취급할 수 있는 함수

고차원 함수: 하나 이상의 동작을 수행하는 함수

커링: x와 y라는 두 인수를 받는 함수 f를 한개의 인수를 받는 g라는 함수로 대체하는 기법

영속 자료구조

함수형 메서드에서는 전역 자료구조나 인수로 전달된 구조를 갱신할 수 없다

→ 자료구조를 바꾼다면 같은 메서드를 두 번 호출했을 때 결과가 달라지면서 참조 투명성에 위배되고 인수를 결과로 단순하게 매핑할 수 있는 능력이 상실되기 떄문

파괴적인 갱신과 함수형

함수형 프로그램에서 전역 자료구조를 변경하게 되면 버그를 유도할 수 있다 → 새로운 자료구조를 만드는 방식으로 해결해 나가야 한다

트리

함수형 프로그램에서 트리에 새로운 노드를 추가하면 모든 사용자가 변경에 영향을 받는다

함수형 프로그램에서 새로운 트리를 만들고 업데이트 시 기존 트리를 갱신하는 것이 아니라 새로운 노드를 만든다

갱신을 수행할 때마다 논리적으로 새로운 자료구조를 만든 다음에 사용자에게 적절한 버전의 자료구조를 전달하는 것도 가능

스트림과 게으른 평가

무한재귀에 빠질 수 있고 병렬화를 할 수 있는 능력을 얻기 위해 스트림은 단 한 번만 소비할 수 있어서 재귀적으로 정의할 수 없다

호출될때마다 생성되는 게으른 리스트가 스트림의 연결고리 역할을 할 수 있다

하지만 게으른 자료구조는 효율성이 떨어질 수 있으니 적절하게 사용해야 한다

패턴 매칭

방문자 디자인 패턴

방문자 디자인 패턴으로 자료형을 언랩할 수 있다

특정 데이터 형식을 방문하는 알고리즘을 캡슐화하는 클래스를 따로 만들 수 있다

방문자 클래스는 지정된 데이터 형식의 인스턴스를 입력으로 받음 → 인스턴스의 모든 멤버에 접근

패턴매칭

자바8은 패턴매칭을 지원하지 않지만 이를 지원하게 된다면 커다란 switch문이나 if-else문을 피할 수 있다

기타 정보

캐싱 또는 기억화

기억화: 메서드에 래퍼로 캐시를 추가하는 기법

래퍼가 호출되면 인수, 결과 쌍이 캐시에 존재하는지 먼저 확인

  • 존재하면 캐시에 저장된 값을 즉시 반환
  • 없을 시 함수를 호출한 후 캐시에 저장 후 결과를 반환

같은 객체를 반환함은 무엇을 의미하는가

참조 투명성: 인수가 같다면 결과도 같아야 한다는 규칙

함수형 프로그래밍에서는 데이터가 변경되지 않으므로 같다는 의미는 ==이 아니라 구조적인 값이 같다는 것을 의미

콤비네이터

둘 이상의 함수나 자료구조를 조합하는 기능

profile
Keep going하는 개발자

0개의 댓글