티스토리 뷰

JavaScript

[JavaScript] 1급 시민, 1급 객체

개발을해보자 2020. 9. 30. 15:02

JavaScript의 함수는 1급 객체(First Class Object)이다.

1급 객체가 무엇이고 이것이 왜 JavaScript에서 중요할까?

 

 

 

1급 시민(First Class Citizen)


JavaScript를 포함한 거의 모든 프로그래밍 언어의 변수에서 1급 시민의 조건은 다음과 같다.

  1. 변수(variable)에 담을 수 있다.
  2. 인자(parameter)로 전달할 수 있다.
  3. 반환 값(return value)으로 전달할 수 있다.
let bar1 = 1;  // 1. 변수에 담을 수 있다.

function foo (param) {  // 2. 인자로 전달할 수 있다.
    let bar2 = param + 1;
    return bar2;  // 3. 반환 값으로 전달할 수 있다.
}

console.log(foo(bar1));  // 2

대부분의 프로그래밍 언어에서 숫자형 / 문자형은 1급 시민의 조건을 충족한다.

JavaScript에서는 위 조건을 기준으로 봤을 때, 기본 자료형(Number, String, Boolean, Null, Undefined, Symbol, Object(Function, Array))이 1급 시민의 조건을 충족한다.

 

 

 

1급 객체(First Class Object)


1급 객체1급 시민의 조건을 충족하는 객체를 뜻한다.

JavaScript에서 객체는 1급 시민이다. 따라서, 1급 객체이다.

let bar1 = { id: '1급 객체' }  // 1. 변수에 담을 수 있다.

function foo (param) {  // 2. 인자로 전달할 수 있다.
    let bar2 = param;
    bar2.pwd = 'abc123';
    return bar2;  // 3. 반환 값으로 전달할 수 있다.
}

console.log(foo(bar1)) // { id: '1급 객체', pwd: 'abc123' }

 

JavaScript에서 함수(function)는 prototype을 통해 Object를 상속 받아 사용한다.

따라서, JavaScript의 함수 역시 Object이다.

 

function foo() {}
foo.id = 'first class object';

console.log(foo);  // { [Function foo] id: 'first class object' }

Object이기 때문에 위와 같이 Key 값을 부여하여 사용할 수 있다.

결과적으로 JavaScript의 함수도 1급 객체라는 결론을 내릴 수 있다.

 

1급 시민의 조건을 기준으로  봤을 때도 마찬가지이다.

let foo1 = function() {};  // 1. 변수에 담을 수 있다.


function foo2(msg) {
	alert(msg);
}

let foo3 = function(greeting) {  // 2. 인자로 전달할 수 있다.
	greeting('hello world');
}


function foo4(msg) {
    return function() {  // 3. 반환 값으로 전달할 수 있다.
        alert(msg);
    }
}

3가지 조건을 모두 충족하고, JavaScript의 함수는 1급 객체라는 결론을 내릴 수 있다.

 

 

 

 

JavaScript에서 함수가 1급 객체인 것이 중요한 이유


JavaScript의 함수가 1급 객체여서 고차 함수(High Order Function)가 가능하기 때문이다.

 

고차함수란 함수를 인자로 받거나 함수를 결과로 반환하는 함수이다.

JavaScript의 내장 함수 중에는 Array.prototype.map, Array.prototype.filter, Array.prototype.reduce 가 있다.

 

또한, 1급 객체가 JavaScript의 클로저(closure)와 만나면 장점이 생긴다.

JavaScript의 함수는 생성될 때 Lexical Environment를 기억하는데, 함수를 주고 받게 되면 이 Lexical Environment가 함께 전달된다.

이를 이용하여 커링(currying)과 메모이제이션(memoization)이 가능해진다.

 

 

 

 

 

 

 

 

 

참고한 포스팅

https://bestalign.github.io/2015/10/18/first-class-object/

'JavaScript' 카테고리의 다른 글

[JavaScript] DOM API  (0) 2020.10.11
[JavaScript] JSON  (0) 2020.10.05
[JavaScript] 고차 함수(Higher-Order Function)  (1) 2020.10.01
[JavaScript] 비동기 처리 방식 - Promise와 async/await  (0) 2020.09.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함