FP의 중요한 첫 번째 개념 Immutability (불변성)
한 번 만들어진 객체는 변하지 않는 것 (final 객체)
1. 참조 불변성: 변수에 할당 된 값이 변하지 않는 것
2. 객체 불변성: 한 번 생성된 객체는 변하지 않는 것
var(mutable 변수) 보다는 val(immutable 변수)을 사용
collection.mutable 보다는 collection.immutable을 사용하도록
참조 투명성 (referential transparency) 을 유지하기 위해서는 Immutability (불변성)이 꼭 필요하다.
(객체에 대한 부수효과(side effect)를 내기 힘들기 때문)
FP의 중요한 두 번째 개념 referential transparency (참조 투명성)
프로그램의 다른 동작을 바꾸지 않고 어떤 표현식을 그에 해당하는 값으로 치환할 수 있을 때, 그 표현식은 참조 투명하다 말할 수 있다.
즉, side-effect가 없음을 보장하는 함수
이점
- 프로그래머와 컴파일러가 프로그램의 행동에 대해 유후하기 하기 쉽다.
- 코드와 알고리즘이 간결해지고 구현이 올바르다는 사실을 증명하기 쉽다.
- memoziation, 공통된 표현식 제거하기(common subexpression elimination), 병렬화(parallelization) 등을 통해 코드를 최적화할 수 있다.
단점
- 새로운 인스턴스를 생성하는 데에 오버헤드
- 반본문(for, while)보다는 재귀호출, 쌓아가기(fold)와 친해져야
- 코드가 오히려 복잡해질 수 있음
불변성을 유지하는 scala progaramming의 핵심
- case class
- foldLeft
- @tailrec
case class
- 함수형 언어의 대수적 데이터 타입 (ADT)에 대응
- 객체지향형 언어의 데이터 전달 객체 (DTO)에 대응
- 패턴 맞추기를 사용하기 위한 핵심 기작
fold
- 부수효과 없는 반복문
- 함수형 언어에서 반복문은 담당 ( 부수효과가 아닌 값 중심의 연산이기 때문 )
- 러턴값이 없는 일반적인 반복문과는 달리 fold는 항상 값을 돌려준다
- 일반적인 반복문은 연산 중심이지만, fold는 값이 어떻게 변하는 지에 초점을 두고 값 중심으로 생각한다
꼬리 재귀
- 재귀 호출을 최적화하기 위한 조검
- 재귀 호출을 이용하면 함수 호출을 단순한 반복문으로 최적화할 수 있어 스택 넘침 방지 및 호출 부담을 줄이는 데 도움을 준다.
Composability
코드 재사용의 핵심 ( 정보 숨기기 ) : 서로를 구성하는 데에 꼭 필요한 정보가 아니면 다른 모듈에서는 볼 수 없도록 숨기기
- 객체가 제공하는 기능을 사용한다
- 객체의 관리는 그 객체를 만든 부모 인스턴스가 한다
- 객체를 잘 사용하기 위해 내부를 알 필요는 없다.
Scala 구성성의 토대: 경로 의존 타입
- 클래스 내부에 정의된 타입 멤버의 타입은 항상 그 클래스 객체의 인스턴스에 의존한다.
'Language > Scala' 카테고리의 다른 글
[Scala] Data Structures (0) | 2019.11.10 |
---|---|
[Scala] Functional data structures (0) | 2019.10.29 |
[Scala] Getting started with functional programming in scala (0) | 2019.10.28 |
[Scala] What is functional programming? (0) | 2019.10.04 |
ex (0) | 2019.03.05 |