자바 개발자를 위한 함수형 프로그래밍
목차
1장. 왜 함수형 프로그래밍을 배워야 하는가?
01. 동시성 프로그램을 잘 작성해야 한다
02. 문제는 데이터를 관리하는 문제로 귀결된다
03. 함수형 프로그래밍은 모듈화되어 있다
04. 더 빠르게 작업해야 한다
05. 함수형 프로그래밍은 단순함으로의 복귀다
2장. 함수형 프로그래밍이란 무엇인가?
01. 함수형 프로그래밍의 기본 원리들
02. 타입 설계하기
03. 연습문제
3장. 데이터 구조와 알고리즘
01. 리스트
02. 맵
03. 조합기 함수: 컬렉션 파워 툴
04. 영속적인 데이터 구조
05. 데이터 구조와 알고리즘에 대한 몇 가지 추가적인 고찰
06. 연습문제
4장. 함수적 동시성
01. 액터 모델
02. 소프트웨어 트랜잭션 메모리
03. 연습문제
5장. 더 나은 객체지향 프로그래밍
01. 명령적인, 변경 가능한 코드
02. 리스코프 치환 원칙
03. 설계 패턴에 대하여
04. 좋은 타입을 구성하는 요소들
05. 객체지향 미들웨어에 대해 다시 생각하기
05. 연습문제
6장. 이제는 어디로 갈 것인가
01. 자바를 위한 함수적 도구들
02. 복습
03. 연습문제
Appendix
참고자료
용어정리
최근 함수형 언어가 뜨는 것은 물론 함수형 프로그래밍에 대한 관심도 증가하는 것 같다. 특히 C++과 JAVA에 람다식이 적용되는 등의 트렌드를 보면 확실히 함수형 프로그래밍이 떠오르는 흐름인 것 같다는 느낌이 든다. 아직 C++을 좋아하고 객체지향에 푹 빠져 Phthon은 써본적도 없어 함수형 프로그래밍에 감이 전혀 안잡히는 터에 마침 간단하게 오고가며 읽을 수 있는 책이 있어 쭉 읽어보았다.
그간 객체지향적 설계에 대해 많은 공부를 진행했지만 생각지 못했던 부분에서 함수형 프로그래밍은 또 새로운 방식으로 동시성 프로그래밍이나 재사용성 증가와 같은 다양한 대안을 제시하는 것 같다. 하지만 몇 가지 점에서 함수형 프로그래밍의 고질적인 성능 문제 등의 단점은 피할 수 없는 것 같다는 생각도 든다.
순차적 루프에 대한 함수형 프로그래밍의 고전적인 대안은 재귀(recursion)다.
자바 개발자를 위한 함수형 프로그래밍, 21p
재귀는 코드만으로도 알고리즘 문제를 명확히 할 수 있다는 장점과 부수효과로 부터 자유로운 함수를 추구하는 함수형 프로그래밍에서 훌륭한 대안이긴 하지만, 컬렉션이 조금만 커져도 이에 수반되는 오버헤드가 너무 커진다는 단점이 있을 수 밖에 없다. 책에서는 고전적인 대안이 재귀라고 명시했는데 이러한 문제가 현재 어떤식으로 풀어나가는지는 조금 궁금.
null 값들은 흔히 발생하는 버그의 주범이다. null이라는 개념을 창시한 토니 호어는 최근에 이를 두고 백만 불짜리 실수였다고 토로한 바 있다.
자바 개발자를 위한 함수형 프로그래밍, 27p
public final class None<T> extends Option<T> { public static class NoneHasNoValue extends RuntimeException {} public None() {} public boolean hasValue() { return false; } public T get() { throw new NoneHasNoValue(); } @Override public String toString() { return "None"; } @Override public boolean equals(Object other) { return (other == null || other.getClass() != None.class) ? false : true; } @Oveerride public int hasCode() { return -1; } }
자바 개발자를 위한 함수형 프로그래밍, 29-30p
null 은 참 다양하게 쓰이고 때에 따라 유용하긴 하지만 항상 문제의 주범이라고 할까나. 폭탄같은 녀석. 여하튼 본 책에서 설명하고 있는 위 방식은 사실 이미 널리 알려진 리팩토링(refactoring)기법 중 하나이지 않은가.
Null 검사를 널 객체에 위임
Introduce Null Object
리팩토링 코드 품질을 개선하는 객체지향 사고법, 310p
함수형 프로그래밍을 이용해 데이터 구조를 설계하는 방식은 매우 새로운 느낌이였다. 아래는 리스트. 책에는 리스트와 맵에 관한 이야기가 담겨 있다.
public class ListModule { public static interface List<T> { public abstract T head(); public abstract List<T> tail(); public abstract boolean isEmpty(); } public static final class NonEmptyList<T> implements List<T> { public T head() { return _head; } public List<T> tail() { return _tail; } public boolean isEmpty() { return false; } protected NonEmptyList(T head, List<T> tail) { this._head = head; this._tail = tail; } private final T _head; private final List<T> _tail; @Override public boolean equals(Object other) { if(other == null || getClass() != other.getClass()) return false; List<?> that = (List<?>)other; return head().equals(that.head()) && tail().equals(that.tail()); } @Override public int hashCode() { return 37 * (head().hashCode() + tail().hashCode()); } @Override public String toString() { return "(" + head() + ", " + tail() + ")"; } } public static class EmptyListHasNoHead extends RuntimeException {} public static class EmptyListHasNoTail extends RuntimeException {} public static final List<? extends Object> EMPTY = new List<Object>() { public Object head() { throw new EmptyListHasNoHead(); } public List<Object> tail() { throw new EmptyListHasNoTail(); } public boolean isEmpty() { return true; } @Override public String toString() { return "()"; } }; @SuppressWarnings(value = "unchecked") public static <T> List<T> emptyList() { return (List<T>) EMPTY; } public static <T> List<T> list(T head, List<T> tail) { return new NonEmptyList<T>(head, tail); } }
자바 개발자를 위한 함수형 프로그래밍, 38-39p
정말 흥미로웠던 부분은 구조 공유(structure sharing)을 이용해 영속적인 데이터 구조를 만드는 방식인데 간략한 원리가 설명되어 있고 자세한 내용은 나와있지 않다. 찾아봐야지.
함수형 프로그래밍, 60-62p, Structure sharing
다른 유용한 할 이야기가 참 많은데 시간이 없어서 틈틈히 추가하기로.
여하튼 함수형 프로그래밍은 다양한 면에서 특히 동시성 프로그래밍 면에서 괭장히 새로운 대안을 제시하고 있어 놀랐던 것 같다. 책은 무척 얇지만 간략하게 함수형 프로그래밍을 이해하는데에는 큰 부족함이 없는 책인 것 같다. 좀 더 알아보고 싶다는 생각이 드는.