
컴퓨터 프로그래밍 언어 디자인에서, 일급 객체(영어: first-class object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 보통 함수에 인자로 넘기기, 수정하기, 변수에 대입하기와 같은 연산을 지원할 때 일급 객체라고 한다.
- 위키 백과
위의 특징을 만족하는 객체를 일급 객체라고합니다. 자바스크립트에서는 함수가 일급 객체로 동작합니다. 즉, 함수를 하나의 값으로 평가할 수 있다는 것입니다. 그렇기 때문에 변수에 할당하거나, 함수의 인자로 넘겨주거나, 함수의 반환값으로 함수를 반환할 수 있게 되는 것이죠.
함수가 일급 객체가 된다는 것이 중요한 의미인 이유는 고차함수에서 나타나게 됩니다. 함수형 프로그래밍을 하면서 고차 함수는 굉장히 강력한 기능을 하게 되죠.
const exec = (f,a) => f(a);
exec(console.log, 1); // 1
exec((a) => a + 1, 1); // 2
위의 코드의 경우 exec함수가 함수를 인자로 받아 a라는 매개 변수를 그 함수의 인자로 넘겨주는 역할을 합니다.
고차함수는 함수를 인자로 받거나, 함수를 리턴하는 함수를 말합니다. 여기서 함수를 인자로 받는 경우 그 인자로 받은 함수를 콜백함수(callback)라고 합니다.
함수를 인자로 받을 수 있다는 것은 함수 내부에서 콜백 함수의 실행 여부를 결정하거나, 원하는 위치에서 실행하는 등 함수 실행에 대한 결정이 자유로워 진다는 것입니다.
또한 고차함수를 이용하여 조합성과 추상화를 통해 코드를 좀 더 작은 기능의 단위로 나눌 수 있고, 여러 함수를 조합해 하나의 기능을 만들 수도 있습니다.
다시 위의 코드를 보시죠.
const exec = (f,a) => f(a);
exec(console.log, 1); // 1
exec((a) => a + 1, 1); // 2
이 코드에서 exec코드는 단순히 f에 a를 인자로 넣어 실행하는 고차함수입니다. 여기서 중요한 것은 exec함수는 실행시킬 f함수가 어떤 함수인지 상관하지 않고 a를 인자로 넘겨 실행한다는 것입니다. 이런 방법이 바로 추상화입니다. 자신이 실행할 함수의 기능은 인자로 넘겨받는 f라는 함수에 완전히 위임하고 단순히 인자로 받은 f에 a를 인자로 넣어 실행하는 기능을 하는 것이죠.
그렇기 때문에 위의 코드에서 console.log와 (a) => a + 1의 두 함수가 모두 인자로 사용될 수 있는 것입니다. exec는 받는 함수가 어떤 함수인지 신경쓰지 않기 때문이죠.
const adder = (a) => (b) => a + b;
console.log(adder(1)(2)); // 3
위의 코드는 함수를 리턴하는 고차함수입니다. 그렇기 때문에 adder(1)(2)와 같은 형태가 나올 수 있죠. 하나하나 보게 되면, 우선 adder에 인자로 1을 넘겨줍니다. 그러면 함수 (b) => 1 + b가 반환되게 되죠. 물론 1은 편의상 제가 넣은 것입니다. 위의 코드는 클로저를 만드는 함수를 리턴한 것이기 때문입니다. 이후 반환된 함수에 인자로 2를 넣어 실행한 것이 위와 같은 형태입니다.
이런 함수를 커링 함수라고 합니다. 커링 함수가 유용한 이유는 하나의 기능을 하는 함수를 미리 만들 수 있다는 것입니다.
const addOne = adder(1);
console.log(addOne(5)); // 6
위와 같이 adder함수를 이용해서 입력값에 1을 더해주는 함수인 addOne을 만들었습니다. 이런 식으로 커링을 이용하면 하나의 기능을 추출해서 이후에 받아야 할 인자를 나중으로 미룰 수 있게 됩니다.