일급 객체란?
다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 말합니다.
즉, 함수에 인자로 넘기기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고합니다.
조건
무명 리터럴로 생성할 수 있다.
(함수 표현식을 의미하며 값으로 표현될 수 있기 때문에 함수 표현식으로 사용가능합니다.)1 2 3
var test = function () { return "test"; };
변수에 저장할 수 있다.
1 2 3 4
var test = function () { return "test"; }; console.log(test()); // test
함수의 실제 매개변수가 될 수 있다.
1 2 3 4 5 6 7 8
var test = function (func) { //func 은 매개변수 (parameter) func(); }; test(function () { console.log("test"); });
함수의 리턴 값이 될 수 있다.
1 2 3 4 5 6 7 8 9
function test() { return function () { // return 값에 함수 console.log("test"); }; } var a = test(); a();
함수 객체
Javascipt
에서 함수를 객체와 동일하게 사용할 수 있습니다.
위에서 말했듯이 변수, 배열 요소, 객체의 값으로 할당할 수 있으며 다른 함수의 인수로 전달되거나 함수에서 반환될 수 있습니다.
또한, 이러한 특징은 함수형 프로그래밍을 가능하게 합니다.
함수는
객체의 인스턴스
이다.함수는 실제로 객체의 인스턴스이며 함수를 정의하는 것은 객체를 만드는 것입니다.
함수는 Object.prototype 객체의 프로퍼티를 상속 받아 고유의 프로퍼티를 사용할 수 있습니다.
1 2 3 4 5 6
function test() { console.log('test'); } console.log(type of test); // function console.log(test instanceof Object) // true
고차 함수 (Higher Order Function)
함수를 인자(parameter)로 받을 수 있고, 함수의 형태로 return할 수 있습니다.
예제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
function test(n) { return n * 2; } function hofunc(n1, func) { // 다른 함수를 인수로 전달 받을 수 있다. const tmp = func(n1); return function (n2) { // return 값으로 함수를 지정할 수 있다. return n2 * tmp; }; } const result = hofunc(3, test)(2); // hofunc(3,test)는 return값으로 받은 함수입니다. // 따라서, 호출 연산자 ()를 사용할 수 있습니다. console.log(result); // 12
콜백 함수 (Callback Function)
다른 함수 (Caller)의 인자로 전달되는 함수를 말합니다.
인자를 넘겨 받는 함수(Caller)는 Callback 함수를 필요에 따라 즉시 실행하거나 비동기적으로 실행 할 수 있습니다.
커리 함수 (Curry Function)
함수를 리턴하는 함수를 부르는 용어입니다.
고차 함수 중에서도 함수를 리턴하는 모양의 함수만을 지칭합니다.
추상화 (Abstraction)
복잡한 내용을 압축해서 핵심만 추출한 상태로 만드는 것입니다.
CPU는 0과 1만 이해합니다. 코드가 해석되는 복잡한 것들은 자바스크립트 엔진이 대신해줍니다.
우리는 자바스크립트 문법(syntax)을 올바르게 사용하는 것만으로, 다양한 프로그램을 비교적 쉽게 작성할 수 있습니다.
이처럼 고민거리가 줄어들고, 문제 해결이 더 쉬워지는 것이 추상화의 장점입니다.
즉, 자바스크립트 포함한 많은 프로그래밍 언어 또한 추상화의 결과입니다.
고차 함수를 사용하는 이유
추상화의 관점에서 함수는 논리(logic)의 묶음입니다.
함수는 값을 전달 받고 값을 return합니다.
값에 대한 복잡한 로직은 감춰져있습니다. 즉, 값 수준에서의 추상화입니다.
고차 함수는 함수를 통해 얻은 추상화를 사고(thick)의 추상화 수준으로 끌어올립니다.
고차 함수는 함수를 전달받거나 함수를 return합니다.
함수에 대한 복잡한 로직은 감춰있다. 즉, 사고 수준에서의 추상화입니다.
추상화의 수준이 높아진 만큼 생산성도 향상됩니다.