속았다. 사실은 함수형 프로그래밍을 주로 다룬다…
-
책에서 다루는 프로그래밍 기술
- 불변 참조를 사용하는 법
- 제어 구조를 제거하는 법
- 예외를 던지지 않고 처리하는 법
- 부수효과를 최소화 하는 법
-
코틀린 기본
- 16진수는 숫자 앞에
0x 를 붙여야 한다
- 2진수는 숫자 앞에
0b 를 붙여야 한다
- 변성
- 같은 타입의 매개변수의 값을 소비하면서 생산해내는 함수가 존재한다면 지정 할 수 없다
- in 타입 매개변수는 오직 함수 입력(argument)으로만 사용 가능하다
- out 타입 매개변수은 오직 출력(return)으로만 사용가능하다
-
함수
- 입력 집합인 정의역(domain)과 결과 집합인 공역(codomain) 사이의 특정 조건을 만족한 대응 관계
- 정의역의 모든 원소는 대응하는 공역 원소가 반드시 1개여야 한다
- 공역의 원소 중에는 정의역에 대응하지 못하는 원소가 존재 할 수 있다
- 부분 함수: 정의역의 모든 원소에 대해 정의되어 있지는 않지만 공역의 한 개 원소에만 대응하는 함수
- 튜플: 여러 원소의 집합. 입력이 여러 개인 함수는 사실 튜플 한개의 입력을 받는 것이다 ex) Pair, Triple 등등
- 상수 함수: 인자에 따라 결과 값이 변하지 않는 함수
- 순수 함수의 조건
- 외부의 어떤 것도 변이시키지 않는다
- 입력을 변이하지 않는다
- 예외나 오류를 던지지 않는다
- 항상 값을 반환한다
- 인자가 같으면 항상 같은 결과이다
- 코틀린에서 인자를 넘기고 반환 값을 얻는 경우에는 fun으로 정의된 함수를, 함수 타입의 식은 함수를 저장하거나 함수를 반환해야 하거나 데이터 구조에 함수를 담는 경우 사용하라
- 항등 함수: 입력 받은 값을 그대로 돌려주는 함수
- 항등원: 입력값으로 연산을 하더라도 원래 입력값과 동일하게 만드는 인자(변수)
- Fold Vs Reduce
- 시작하는 원소를 제공한다면 fold, 아니면 reduce
- 결과가 입력 원소와 동일하면 reduce 아니면 fold
-
재귀
- 공 재귀(꼬리 재귀): 한 단계의 출력이 다음 단계의 입력으로 사용되는 재귀
- 재귀: 마지막 단계부터 차례로 계산하여 최종 결과를 연산하는 함수
- 메모화를 이용한 함수도 순수 함수이다 → 사실 진정한 순수 함수라면 이전 재귀의 결과가 다음 재귀 함수의 인자로 입력되어야 한다
-
선택적 데이터 처리
- 센티넬 VALUE: 값이 존재하지 않음을 표현하기 위해 지정한 값 ex) int: 0, string: empty
- Either 타입: 두 가지 타입 값 중 한 가지를 반환하는 함수를 작성할 때 유용하다
- Result 타입: 데이터나 오류 중 하나를 표현해야 타입이 필요할 때 유용하다
-
즉시 계산과 지연 계산
- 즉시 계산에서 함수 인자는 값으로 전달되고, 지연 계산에서는 이름으로 전달된다
- by Lazy를 이용하여 여러 번 호출하더라도 한번만 연산하도록 만들 수 있다
- 자바 스트림은 제네레이터로써 한번 사용되면 재 사용할 수 없으나, 코틀린 시퀀스는 재 사용 가능하다
-
트리
- 연결 리스트의 비 효율적인 연산인 정렬, 인덱스를 이용한 접근, 최대/최소 값 찾기에 유용한 자료구조
- 완전(포화) 균형 트리: 모든 하위 트리가 같은 수의 원소를 지닌 트리
- 완전 이진 트리: 리프를 제외한 모든 노드가 채워진 트리
- full(전) 이진 트리: 모든 노드가 0개 또는 2개의 노드를 가진 트리
- 이진 검색 트리: 순서가 있는 트리
- 왼쪽 가지는 항상 부모 노드보다 작다
- 오른쪽 가지는 항상 부모 노드보다 크다
- 레드-블랙 트리: 스스로 균형을 잡는 트리
- 레프티스트 힙: 우선 순위 큐를 구현할 때 좋은 트리
- 관례로 가장 낮은 값을 가장 높은 우선 순위로 친다
-
함수형 입출력
- 효과(effect): 프로그램 외에 관찰 할 수 있는 모든 것( 데이터 등등 )
- 컴프리헨션 패턴: 컬렉션을 편하게 다루기 위한 패턴 → 파이썬 참조
- 함수형 프로그래밍은 사전 조건과 사후 조건만 테스트로써 검증하면 된다
- 참조 투명식: 외부 상태를 변경하거나 의존하지 않는 함수
- 치환 모델: 참조 투명한 식을 그 결과 값으로 치환해 계산하는 모델