일급 객체(First Class Object)란?

설정·2020년 12월 16일
18

자바스크립트를 공부하다보면 일급 객체라는 말을 한 번쯤은 들어보았을 것이다.
이번에는 그 일급객체가 무엇인지에 대해서 정리해보고자 한다.

일급 객체(1급객체, First Class Object)

일급객체에 대한 정의이다.

일급객체(First-class Object)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. [위키백과]

일급객체의 조건에 대해서 정의를 내려보겠다.

  • 변수에 할당(assignment)할 수 있다.
  • 다른 함수를 인자(argument)로 전달 받는다.
  • 다른 함수의 결과로서 리턴될 수 있다.

위에 대한 조건으로 인해 알 수 있는 것은 함수를 데이터(string, number, boolean, array, object) 다루 듯이 다룰 수 있다는 점이다.

여기서 데이터를 다룬다는 의미는 변수에 할당이 가능하다는 것으로, 함수 역시 할당이 가능하다는 의미이다.

그렇다면, 함수가 일급객체이기 때문에 할 수 있는 것은 무엇인가?

  • 고차함수(Higher order function)를 만들 수 있다.
  • 콜백(callback)을 사용할 수 있다.

고차함수콜백에 대해서는 아래에 더 설명을 이어가겠다.
우선, 일급객체의 조건 예시를 살펴보겠다.


1. 변수에 할당(assignment)한다.

변수에 할당은 함수 표현식을 생각하면 된다.

const mul = function (num) {
  return num*num;
}

2. 다른 함수를 인자(argument)로 받는다.

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 = '매개변수'

그런데 이런 내용이 어디에 정의되어 있는가?

이건 아마 '인자'라는 단어가 명확히 정의되어 있지 않아서, 그리고 argumentparameter의 의미를 혼동하는 일이 생겨 정의해준 것이 아닌가 싶다.

하지만, 내 생각에는 '인수''인자' 대신 정확한 표현인 '전달인자''매개변수'라고 표현 해주는 것이 더 옳은 의사표현이 아닐까 싶다.

cf.) 파라미터로 전달받는다.
파라미터로 전달 받는다는 건 따져보면 argument로 함수를 받아야 할 때 parameter로 함수가 있어야하니까 뭐 틀린말은 아닌건가...?

3. 다른 함수의 결과로 리턴 될 수 있다.

  • 반환값(return value)로 사용할 수 있다.
function add(num1) {
  return function (num2) {
    return num1 + num2;
  }
}

add(3)(4); // 7

지금까지 일급객체에 대해서 알아보았다.
그럼 이 일급객체로 인해 할 수 있는 일에 대해서 살펴보겠다.
일급객체 조건을 설명하면서 살짝 언급되었던 고차함수부터 시작하겠다.

고차함수(Higher-order function)

함수를 전달인자(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;
  };
}

# 함수를 인자로 받고, 함수를 리턴하는 경우

콜백함수(callback)

전달인자(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

0개의 댓글