1-3. 타입과 값 - 타입에 대한 전략
— Functional programming — 1 min read
프로그래머스에서 진행한 유인동님의 ES6로 알아보는 동시성 & 함수형 프로그래밍 강의를 들으며 정리한 내용입니다.
# 지연성이란?
코드를 최대한 평가하지 않는 상태로 유지하여, 메모리에 할당되지 않게 되는 성질
- 지연성을 가진 함수 -> 조건이 완벽해질 때까지 평가하지 않는다
- 평가가 안된 상태로 코드로 남아있다 -> 메모리에 쌓이지 않는다
ex. lodash의map, filter, reduce
는 지연평가라는 개념을 적용한 함수
- Javascript라는 언어는 기본적으로 즉시평가
- Clojure라는 언어는 기본적으로 지연평가
# 메타프로그래밍
프로그래머에게 protocol(규약)을 제공함으로써, 단순히 언어가 제공하는 사용법을 익히는게 아닌, 정교하게 조작하며 해당언어를 확장성 있게 사용하게 하고자하는 철학
lisp과 같은 언어엔, 지연성을 가지게하는 규약(protocol)이 있다. 효과가 있는 함수만 평가함
ex) 이런 성질을 자바스크립트 언어로 묘사해보자면...1[1, 2, 3] // 평가 안함2.map(a => a * 2) // 평가 안함3.forEach(a => console.log(a)) // 효과가있는 함수 console.log -> 평가함자바스크립트에선 지연성이란 개념이 거의 없지만
iterator, iterable, generator 프로토콜이 있고, 이를 활용하여 다양한 함수를 만들어볼 것이다
# Javascript에서의 지연평가
&&
,||
1을 평가한 후, 8을 위한 메모리 할당할지 여부를 결정1```js21 || 8 // 1 -> 8은 메모리에 올라가지 않음31 && 8 // 8 -> 8이 메모리에 올라감4```iterator iterable, generator 프로토콜
- iter를 선언했을뿐, 새로운 값이 만들어지진 않은 상태
.next()
로 iterator가 실행되기 전까진, iterable의 값들에 대한 메모리할당이 전혀 이루어지지 않음 -> 지연평가
1var iter = fs[Symbol.iterator]()
# 타입과 값
- 언어의 근간을 알아야 그 언어를 제대로 사용할 수 있다
- 시작은 언어에서 제공하는 "타입과 값"을 아는것
- Javascript는 멀티 패러다임 언어
- OOP, 명령형, FP방식으로 모두 프로그래밍 가능하기 때문에, 어떤 전략을 세울지 명확히하고 프로그래밍을 시작해야한다
- 리액트, 뷰, 앵귤러는 Javascript를 사용하기 위한 "일종의 전략"
- 함수형 프로그래밍엔 크게 두가지 뼈대가 있다
- Clojure
타입을 최소화함 - Haskell
타입을 중시함
- Clojure
- ADTs (Abstract Data Types)
- 모든 값을 객체로 싸서, 자바스크립트를 Haskell처럼 프로그래밍하는 방식. 컴파일단에서 최적화할 방법이 없어 매우 느려지는 단점
# Javascript의 타입 -- JSON 데이터타입
- Js에서 타입은 크게 "객체(object) / 객체가 아닌 것"으로 나눌 수 있다
- JSON에서 값은 "직렬화할 수 있는 값 / 그렇지 않은 값"으로, 나누어 바라볼 수 있다
Jasvascript | JSON |
---|---|
null | null |
boolean | true, false |
number | number |
string | string |
object | object |
symbol | array |
undefined | X |
JSON에선 undefined라는 값을 전달할 수 없다 (중요)
# JSON 데이터 타입
- 경량의 DATA-교환 형식이면서, 현대 프로그래밍에서 가장 많이 사용됨
- undefined, Map, Set은 JSON으로 직렬화 할 수 없다 (= 데이터로 전달할 수 없다)
1JSON.stringify(null); // "null"2JSON.stringify(undefined); // undefined -> 동작된 것 아님3JSON.stringify([undefined]); // "[null]"4JSON.stringify({ a: undefined }) // "{}"5
6JSON.stringify(new Map([['a', 1]]); // "{}" -> 동작안됨7JSON.stringify(new Set([1,2,3])); // "{}" -> 동작안됨