일급 객체에 대한 정의
일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. [위키백과]
이름이 왜 일급객체일까 찾아봤는데 이런 이유가 있다.
일단 말 그대로 first class citizen, second class citizen 이란 무엇일까요? first class citizen이란 자유롭게 거주하고 일 할 수 있고, 출입국의 자유를 가지며, 투표의 자유를 가지는 시민을 의미한다면, second class citizen이란 시민 또는 합법적 거주자이지만 시민권 및 사회 경제적 기회가 제한되어있는 시민을 의미합니다. 예를 들면, 19세기 초 참정권을 가진 남성이 first class citizen이라면, 참정권을 가지지 못했던 여성은 second class citizen이라고 할 수 있는 것이죠.
프로그래밍 세계에서도 비슷한 개념이 존재합니다.프로그래밍 언어 디자인에서, 특정 언어의 first-class citizens(first-class type, 또는 first-class object, 또는 first-class value라고도 할수 있는데)이란 보통 다른 객체들에게 적용 가능한 연산을 모두 지원하는 객체를 말합니다. 이러한 연산에는 보통 매개변수로 전달되고, 함수에서 반환되고 수정되고 변수에 할당되는 작업이 포함되는데요.
출처 - javascript에서 함수가 왜 1급객체일까요?
일급 객체의 조건
변수에 할당(assignment)할 수 있다.
다른 함수를 인자(argument)로 전달 받는다.
다른 함수의 결과로서 리턴될 수 있다.
위에 대한 조건으로 인해 알 수 있는 것은 함수를 데이터(string, number, boolean, array, object) 다루 듯이 다룰 수 있다는 점이다.
const a = () => {
doSomething();
}
데이터를 다룬다는건 변수에 할당이 가능하다는건데, 위의 정의에 의해서 함수 역시 변수에 할당 가능하다.
자바스크립트에서는 함수가 일급객체이다.
실제로 자바에서는 함수를 선언하고 변수에 담는건 본적이 없는 것 같다.
그 이전에 일급객체의 조건 예시를 살펴보자
const mul = function (num) {
return num*num;
}
- 고차함수(Higher order function)를 만들 수 있다.
- 콜백(callback)을 사용할 수 있다.
고차함수와 콜백에 대해서는 아래에 더 설명을 이어가겠다.
우선, 일급객체의 조건 예시를 살펴보겠다.
function mul(num) {
return num*num;
}
// func는 매개변수임, 이름은 아무거나 지정해도 상관없음
function mulNum(func, number) {
return func(number);
}
let result = mulNum(mul, 3); // 9
- mul()에서 매개변수가 하나이기 때문에 mulNum()의 매개변수(number)가 하나임
- 만약 mul()의 매개변수가 2개라면 mulNum()의 매개변수도 2개이여야함
- mulNum()의 매개변수인 func는 위의 mul()을 나타내는 것임
- 마지막 result변수에 mulNum()을 할당하고 인자로 mul()을 받아옴
- 이 때 mulNum()인자로 다른 함수(mul())를 받아오기 때문에 고차함수임
function add(num1) {
return function (num2) {
return num1 + num2;
}
}
add(3)(4); // 7
함수를 전달인자(argument) 또는 매개변수(parameter)로 받거나 함수를 리턴하는 함수를 말한다.
2번예시와 3번예시가 고차함수의 예임
전달인자(Argument)로 받는 함수이다.
출처 - 1급객체란 무엇인가