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의 함수는 1급 객체(first class object)이다