자바스크립트를 공부하다보면 일급 객체
라는 말을 한 번쯤은 들어보았을 것이다.
이번에는 그 일급객체
가 무엇인지에 대해서 정리해보고자 한다.
일급객체에 대한 정의이다.
일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. [위키백과]
일급객체의 조건에 대해서 정의를 내려보겠다.
- 변수에 할당(assignment)할 수 있다.
- 다른 함수를 인자(argument)로 전달 받는다.
- 다른 함수의 결과로서 리턴될 수 있다.
위에 대한 조건으로 인해 알 수 있는 것은 함수
를 데이터(string
, number
, boolean
, array
, object
) 다루 듯이 다룰 수 있다는 점이다.
여기서 데이터를 다룬다는 의미는 변수에 할당이 가능하다는 것으로, 함수 역시 할당이 가능하다는 의미이다.
- 고차함수(Higher order function)를 만들 수 있다.
- 콜백(callback)을 사용할 수 있다.
고차함수
와 콜백
에 대해서는 아래에 더 설명을 이어가겠다.
우선, 일급객체
의 조건 예시를 살펴보겠다.
변수에 할당은 함수 표현식을 생각하면 된다.
const mul = function (num) {
return num*num;
}
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()
)를 받아오기 때문에 고차함수
임// 이 부분에서 mul을 인자로 받는 mulNum이 고차함수
// mul은 콜백함수이다.
let result = mulNum(mul, 3);
* 내 생각
파라미터(parameter)로 전달 할 수 있다.
function mul(num) { return num * num } function mulNum(func, number) { // func가 파라미터로 받음 return func(number); }
어디에서는 파라미터로 전달하는 것도
고차함수
라고 한다.
이건 아마고차함수
의 정의부분 중 하나의 '단어' 때문이 아닐까 생각한다.[ 함수를 인자로 전달받는다. ]
나는 이 '인자'라는 단어를
argument
라고 알고있었다.
하지만, 많은 사람들은 '인자'를parameter
로, '인수'를argument
로 부른다고 한다.'인수' =
argument
= '전달인자'
'인자' =parameter
= '매개변수'그런데 이런 내용이 어디에 정의되어 있는가?
이건 아마 '인자'라는 단어가 명확히 정의되어 있지 않아서, 그리고
argument
와parameter
의 의미를 혼동하는 일이 생겨 정의해준 것이 아닌가 싶다.하지만, 내 생각에는 '인수'와 '인자' 대신 정확한 표현인 '전달인자'와 '매개변수'라고 표현 해주는 것이 더 옳은 의사표현이 아닐까 싶다.
cf.) 파라미터로 전달받는다.
파라미터로 전달 받는다는 건 따져보면argument
로 함수를 받아야 할 때parameter
로 함수가 있어야하니까 뭐 틀린말은 아닌건가...?
function add(num1) {
return function (num2) {
return num1 + num2;
}
}
add(3)(4); // 7
지금까지 일급객체에 대해서 알아보았다.
그럼 이 일급객체로 인해 할 수 있는 일에 대해서 살펴보겠다.
일급객체 조건을 설명하면서 살짝 언급되었던 고차함수부터 시작하겠다.
함수를 전달인자(argument) 또는 매개변수(parameter)로 받거나 함수를 리턴하는 함수를 말한다.
예시는 위의 2번과 3번을 참고하면 된다.
# func는 익명함수
# 다른 함수를 인자로 받는 경우
function mul(num) { return num * num }
function mulNum(func, num) {
return func(num);
}
# 함수를 리턴하는 경우
function mul(num1) {
return function(num2) {
return num2*num1;
};
}
# 함수를 인자로 받고, 함수를 리턴하는 경우
전달인자(Argument)로 받는 함수이다.
# 전체적으로 정리
# 위의 정리된 코드와 같은건데 함수 표현식으로 작성한것 뿐
// 일반함수
const mul = function(num) { return num * 2 }
// 매개변수(parameter)로 func를 받았고, 함수(func)를 리턴하기 때문에 고차함수
const mulNum = function(func, num) { return func(num) }
// mulNum은 전달인자(argument)로 함수(mul)을 받았으므로 고차함수
// 전달인자(argument)로 받은 함수인 mul은 콜백함수
mulNum(mul, 3) // 6