개인공부/TIL(Today I Learned)

TIL 43일차_1급시민

soon327 2021. 3. 2. 01:31

객체지향프로그래밍을 배우면서
1급 시민에대해 다시 정리할 필요가 있다고 느껴서,
1급 시민, 1급 객체, 1급 함수, 고차 함수 등에 대해 정리해보려고 한다.

1급시민

프로그래밍 언어에서 1급 시민의 조건은 다음과 같다.

  1. 변수에 담을 수 있다.
  2. 함수의 인자로 전달할 수 있다.
  3. 함수의 반환값(return)으로 전달할 수 있다.

거의 모든 프로그래밍 언어에서 숫자형, 문자형은 1급 시민의 조건을 충족한다.

1급객체

1급객체란, 말 그대로 1급 시민의 조건을 충족하는 객체이다.
JavaScript에서 객체는 1급 시민이므로, 1급객체라 할 수 있다.

1급함수

Javascript에서 함수는 객체이며, 따라서 1급 시민에 해당하므로 1급함수라고 할 수 있다.
몇몇 학자들은 1급 함수가 되려면 1급 시민의 조건과 함께 다음의 추가적인 조건을 충족해야 한다고 말한다.

  • 런타임 생성이 가능하다.
  • 익명으로 생성이 가능하다.

JavaScript에서 함수는 위의 추가적인 조건도 만족하므로 1급함수라고 말할 수 있다.

고차함수

고차함수는 함수를 인자로 받거나, 함수를 리턴하는 함수를 말한다.
이 때, 인자로 전달되는 함수를 콜백함수라고 한다

한펀, 함수를 리턴하는 함수를 커리함수라고 따로 부르기도하는데,
이럴 때에 고차함수는 함수를 인자로 받는함수만을 의미한다.

하지만 엄밀히 말해서, 고차함수는 커리함수를 포함한다.

JavaScript에서 함수가 1급 객체인 것이 중요한 이유

함수가 1급 객체라는 사실은 겉으로 봤을 땐 그리 특별하지 않다.
함수를 그냥 주고받을 수 있다는 것 뿐이지만 이것이 아주 큰 차이점을 만든다.

가장 중요한 장점은 바로 고차 함수(high order function)가 가능하다는 점이다.
JavaScript의 each, filter, map, sort 등의 함수들이 얼마나 편리한지는 잘 알고 있을 것이다.
인자로 목적에 맞는 함수를 하나 넘겨주면 아주 쉽게 처리가 된다.

1급 객체가 JavaScript의 클로져(closure)와 만나면 또 하나의 장점이 생긴다.
JavaScript의 함수는 생성될 당시의 Lexical Environment를 기억하게 되는데,
함수를 주고받게 되면 이 Lexical Environment도 함께 전달된다.
이것을 이용해서 커링(currying)과 메모이제이션(memoization)이 가능해진다.
(커링과 메모이제이션에 대해서도 공부하자!)

참고:da.som,
Bestaligns'dev blog