Skip to content
Underbleu
GithubLinkedin

1-3. 타입과 값 - 타입에 대한 전략

Functional programming1 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```js
    21 || 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
      타입을 중시함
  • ADTs (Abstract Data Types)
    • 모든 값을 객체로 싸서, 자바스크립트를 Haskell처럼 프로그래밍하는 방식. 컴파일단에서 최적화할 방법이 없어 매우 느려지는 단점

# Javascript의 타입 -- JSON 데이터타입

  • Js에서 타입은 크게 "객체(object) / 객체가 아닌 것"으로 나눌 수 있다
  • JSON에서 값은 "직렬화할 수 있는 값 / 그렇지 않은 값"으로, 나누어 바라볼 수 있다
JasvascriptJSON
nullnull
booleantrue, false
numbernumber
stringstring
objectobject
symbolarray
undefinedX

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])); // "{}" -> 동작안됨