JavaScript 기초) JS에서 함수는 1급 객체이다
JavaScript에서 함수는 1급 객체(first class object)다.
1급 객체? 그게 뭐죠?
1급 객체(First Class Object)
1급 객체란 특정 언어에서 객체를 1급 시민으로써 취급한다는 뜻입니다.
조금 다르게 표현하면? "1급 시민 조건 + 객체 = 1급 객체"
1급 시민 : 1967년 Christopher Strachey가 수업에 사용한 노트에서 정의한 용어
일반적으로 1급 시민의 조건은 다음과 같습니다.
- 변수(variable)나 데이터 구조에 담을 수 있다
- 인자(parameter)로 전달할 수 있다
- 반환값(return value)으로 전달할 수 있다
1급 시민의 대표적인 예로 숫자를 들 수 있겠네요!
자 앞서 말했듯 1급 객체란 객체를 1급 시민으로 취급하고, 그렇기 때문에 1급 시민의 조건을 모두 충족합니다.
'1급 함수'라는 정의도 존재합니다. 학자에 따라서 1급 함수에는 2가지 정도의 추가 조건(런타임 생성, 익명 생성)이 더 붙는다는 특징이 있습니다.
하지만 JS에서는 함수 또한 객체이기 때문에 따로 기술하지는 않겠습니다!
JavaScript의 함수는 객체다. 그것도 1급 객체..
제목 그대로입니다. 앞서 말한 1급 객체는 JS의 함수에도 적용이 됩니다.
즉 JavaScript의 함수는 입력 값을 받으면 결과를 반환하는 구조이면서(함수 자체의 특징) 함수 자체를 '값'으로 취급(1급 시민의 조건을 다 만족)할 수 있다는 특징이 있는 것이죠!
이걸 왜 알아야 하죠?
JS의 함수가 1급 객체인게 어쨌다는 거지?
단순하게 생각하면 함수를 1급 시민의 조건대로 다룰 수 있다는 의미겠죠?
이러한 장점이 세부적으로 들어가게 되면 여러 부분에서 큰 장점으로 작용되게 됩니다.
어떤 장점들이 있을까요?
- 고차 함수가 가능하다. - JS의 each, filter, map, sort 함수(내부적으로 돌아가는 구조가 Java 7의 Collections.sort 함수에 비해 훨씬 효율적)
- 1급 객체+클로져 = 커링(Currying)과 메모이제이션(Memoization)이 가능해진다
이와 같은 장점들이 존재하네요!
두 번째 항목은 찾아보니 간단하게 기술할 수 있는 주제는 아닌 것 같아서 커링과 메모이제이션에 대해서는 또 다른 포스팅에서 공부해보도록 하겠습니다.
저보다 좀 더 JS의 함수에 대해 자세히 설명해주신 블로그 또한 첨부하겠습니다!
JavaScript에서는 함수(Function)도 객체(Object)다.
지난 포스팅에서 배열(Array)가 객체(Object)로 취급된다는 것을 확인했다. 그리고 JavaScript에서는 함수(Function)도 객체다. 본격적인 이야기를 시작하기 전에, 1급객체(First-Class Citizens)에 대해 짚고..
preamtree.tistory.com
참고 자료
JavaScript의 함수는 1급 객체(first class object)이다