본문 바로가기

Language/Scala

[Scala] FP의 두 가지 개념

반응형

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