컴퓨터 프로그래밍을 공부하다보면 우리 말로 번역하면 1급 시민 정도로 번역이 되는 first class citizen이라는 용어를 접하게 된다.
first라는 단어에서 추측해볼 수 있게 second class citizen, third class citizen이라는 용어도 존재하지만 일반적으로 사용되지 않는다.
(개인적으로 우리 사회의 주류, 비주류 시민을 나타내는 용어로 느껴져서 썩 긍정적인 단어로 안 느껴진다.)
first class citizen은 robin popplestone에 의해 정의 되어 졌는데, 다음과 같은 조건을 만족시키는 객체, 함수, 데이터형 등이 해당 프로그래밍 언어의 first class citizen이 된다.
- 1. 함수의 매개변수로 전달할 수 있어야 한다. (All items can be the actual parameters of functions.)
- 2. 함수의 결과값으로 반환될 수 있어야 한다. (All items can be returned as results of functions.)
- 3. 할당문의 대상이 될 수 있어야 한다. (All items can be the subject of assignment statements.)
- 4. 동등성 비교가 가능해야 한다. (All items can be tested for equality.)
만약 프로그래밍 언어에서 위의 조건을 function이 만족하면 해당 언어는 function이 1급 시민이고, object이면 object가 1급 시민이다.
이것을 각각 first class function, first class object라고 한다. 물론 한 언어가 여러개의 경우를 만족하기도 한다.
자바스크립트는 object와 function 모두 1급 시민으로 가지기 때문에 예시를 찾기 쉬우므로 자바스크립트로 예시를 만들었다.
언어의 1급 시민을 만족시키는 조건의 예시는 다음과 같다.
1. 자바스크립트의 first class object
var obj = {property : "property"} //3. 할당문의 대상이 된다.
var obj2 = obj;
function returnObject(object) {
return object;
}
console.log(returnObject(obj)); //1. 함수의 매개변수로 전달된다. 2. 함수의 결과 값으로 반환된다.
console.log(obj === obj2); //4. 동등성 비교가 가능해야 한다.
2. 자바스크립트의 first class function
var f = function returnNumber(number) {
return number;
} //3. 할당문의 대상이 된다.
var f2 = f;
function add(num1, num2) {
return f(num1 + num2); //2. 함수의 결과 값으로 반환된다.
}
console.log(add(f(1), f(2))); //1. 함수의 매개변수로 전달된다.
console.log(f === f2); //4. 동등성 비교가 가능해야 한다.