객체지향프로그래밍을 배우면서
1급 시민에대해 다시 정리할 필요가 있다고 느껴서,
1급 시민, 1급 객체, 1급 함수, 고차 함수 등에 대해 정리해보려고 한다.
1급시민
프로그래밍 언어에서 1급 시민의 조건은 다음과 같다.
- 변수에 담을 수 있다.
- 함수의 인자로 전달할 수 있다.
- 함수의 반환값(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)이 가능해진다.
(커링과 메모이제이션에 대해서도 공부하자!)
'개인공부 > TIL(Today I Learned)' 카테고리의 다른 글
TIL 45일차_알고리즘_이진탐색트리 (0) | 2021.03.04 |
---|---|
TIL 44일차_setTimeout의 this와 이를 제어하는 bind메소드 (0) | 2021.03.03 |
TIL 42일차_상속 방법 두가지: pseudoClassical패턴과 ES6+ class문법 (0) | 2021.03.01 |
TIL 41일차_상속과 프로토타입 (0) | 2021.02.28 |
TIL 40일차_ 객체지향프로그래밍(OOP) (0) | 2021.02.27 |