함수형 프로그래밍 #2

Y·2020년 8월 10일
0

Chapter 2


First-Class Functions and Applicative Programming

Functions as First-Class Things


'First-Class' 라는 용어의 정의는 다음과 같다.
'First-Class' 라는 어떠한 것은 그 자체가 값이다. 일급 함수는 다른 여러 값들 처럼 사용될 수 있다. 자바스크립트에서 Number자료형이 일급이듯, 일급함수 역시 이와 비슷한 성질을 가진다.

  • 변수에 저장될 수 있다.
  • 배열의 요소로서 저장될 수 있다.
  • 객체의 프로퍼티 값으로 저장될 수 있다.
  • 필요에 따라 생성할 수 있다.
  • 함수의 매개변수 인수로서의 역할을 할 수 있다.
  • 반환될 수 있다. (return)

고위 함수(Higher Function) 는 마지막 두 성질을 갖는다.

Javascript's Multiple paradigms


이 책에서 함수형 프로그래밍과 비교할 패러다임은 다음과 같다.

  • 명령형 프로그래밍 : Programming based around describing action in detail
  • 프로토타입 기반 객체지향 프로그래밍 : Programming based around prototypical objects and instances of them
  • 메타프로그래밍 : Programming manipulating the basis of JavaScript's execution model

Imperative programming


프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종이다. 알고리즘이 아주 상세하게 풀어서 설명되어 있다.

이를 함수형프로그래밍으로 바꾸면 이런 느낌이다.

이처럼 함수형 프로그래밍은 프로그램을 잘게 나누어 추상화시키고 이를 다시 재조합시키는 과정이다. 이러한 사고방식을 이용하면, 내가 모델링하고있는 프로그램의 로직을 보다 효율적으로 짜는데 도움이 된다.

Prototype Programming


자바스크립트는 C++이나 자바 같은 객체지향 프로그래밍 언어와는 다른 프로토타입 기반의 객체지향 프로그래밍을 지원한다. 자바스크립트에서는 객체 리터럴이나 생성자 함수로 객체를 생성한다. 이렇게 생성된 객체의 부모 객체가 바로 '프로토타입' 객체다. 클래스 상속 개념과 마찬가지로 자식 객체는 부모 객체가 가진 프로퍼티 접근이나 메서드를 상속받아 호출하는 것이 가능하다. 객체지향과 함수형프로그래밍을 모두 지원하는 언어에서의 그 차이는 자기 자신의대한 참조가 어떻게 핸들링되냐이다.

MetaProgramming


메타 프로그래밍이란 간단히 말해 프로그램이 코드를 수정하도록 하는 프로그래밍이라고 볼 수 있다. 정확하게 어떤 기법이라기보다는 그러한 개념 전반을 메타 프로그래밍이라고 부르는데, 어떤 프로그램이 다른 언어로 작성된 코드를 열어 '문자열'을 고치듯이 코드를 수정하거나 같은 언어끼리, 심지어는 스스로가 수정해도 모두 메타 프로그래밍의 범주에 들어간다. 이 책에서는 깊게 다루지 않는다고 한다.

Applicative Programming


대표적인 Applicaitve function은 reduce, map , filter이다.
reduce 는 컬렉션의 각 원소를 순회하며, 어떠한 누적값을 연산한다.
map은 컬렉션의 원소에 어떠한 함수를 적용하여 새로운 컬렉션을 반환한다.
filter은 어떠한 함수를 적용하여 true값을 반환하는 원소들로만 이루어진 새로운 컬렉션을 반환한다.

Collection centric Programming


열거 가능한 값들을 컬렉션이라 하며, 대표적인 예로는 JSON 데이터 타입 내의 object, Array, Map 등이 있다. 위의 reduce, map, filter은 컬렉션을 지원한다.
컬렉션 중심 프로그래밍의 목표는 컬렉션을 다루는 좋은 로직의 함수 세트들을 만들어 재사용성을 극대화 시키는 데 있고, 크기가 작기때문에 값의 변이 과정을 고려하지 않고도, 코드가 무슨 일을 하는지 쉽게 알 수 있으며,작은 함수들을 조합하여 로직을 짜게 되면, 함수 이름으로 로직을 읽기 때문에 복잡한 코드를 이해하기 쉽다.

profile
연세대학교 산업공학과 웹개발 JavaScript

0개의 댓글