Chapter 18. 함수형 관점으로 생각하기
18.1 시스템 구현과 유지보수
- 함수형 프로그래밍은 부작용 없음과 불변성을 제공한다.
18.1.1 공유된 가변 데이터
- 부작용의 개념: 함수 내에 포함되지 못한 기능
- 자료구조를 고치거나 필드에 값을 할당(setter 메서드 같은 생성자 이외의 초기화 동작)
- 예외 발생
- 파일에 쓰기 등의 I/O 동작 수행
18.1.2 선언형 프로그래밍
- 두가지 시스템의 구현 방식
- "어떻게"에 집중하는 명령형 프로그래밍
- "무엇을"에 집중하는 선언형 프로그래밍
18.1.3 왜 함수형 프로그래밍인가?
함수형 프로그래밍은 선언형 프로그래밍을 따르는 대표적인 방식이다.
18.2 함수형 프로그래밍이란 무엇인가?
-
함수형 프로그래밍: 함수를 이용하는 프로그래밍
-
함수: 수학적인 함수.
- 0개 이상의 인수를 가지며, 한 개 이상의 결과를 반환하지만 부작용이 없어야 한다.
-
수학적 표현만 사용하는 방식을 순수 함수형 프로그래밍이라 한다.
-
시스템의 다른 부분에 영향을 미치지 않는다면 내부적으로는 함수형이 아닌 기능도 사용하는 방식을 함수형 프로그래밍이라 한다.
18.2.1 함수형 자바
-
메서드의 바디를 잠금(Lock)으로써 함수형을 달성할 수 있다.
- 하지만 이 방식은 메서드를 병렬로 호출할 수 없게 된다.
-
함수나 메서드는 지역변수만을 변경해야 함수형이라 할 수 있다.
-
함수나 메서드에서 참조하는 객체가 있다면 그 객체는 불변 객체여야 한다.
-
객체의 모든 필드가 final이어야 하고, 모든 참조 필드는 불변 객체를 직접 참조해야 한다.
-
예외적으로 메서드 내에서 생성한 객체의 필드는 갱신할 수 있다.
- 외부에 노출되지 않아야 하고 다음에 메서드를 다시 호출한 결과에 영향을 미치지 않아야 한다.
18.2.2 참조 투명성
- 참조 투명성은 기억화 또는 캐싱을 통해 최적화
18.2.3 객체지향 프로그래밍과 함수형 프로그래밍
18.2.4 함수형 실전 연습
static 쓰지 마라
18.3 재귀와 반복
재귀는 비싸다.