본문 바로가기

Computer Programming/Javascript

자바스크립트의 일급 객체(First-class Function)로서의 함수

1. 일급객체(First-class Object)란?

일급객체란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 즉 프로그래밍 언어의 함수가 다른 변수처럼 다루어질 때 일급함수를 가진다고 한다. 일급함수를 가진 언어에서 함수는 다른 함수들에 전달인자로 제공되고, 다른 함수에 의해 반환될 수 있으며, 변수의 값으로서 할당될 수 있다.

 

자바스크립트는 함수를 객체로 취급하기 때문에, 함수를 매우 유연하게 사용할 수 있다. first-class 라는 단어 그대로 자유롭게 다른 객체들에게 적용 가능한 연산을 지원한다.

 

일급 객체의 조건은 아래와 같다.

1) 변수나 데이터 구조 안에 객체를 담을 수 있다.

2) 파라미터로 전달할 수 있다.

3) 리턴 값으로 사용할 수 있다.

 

 

2. 일급객체로서의 함수 사용

2-1. 변수에 함수를 할당할 수 있다.

- 함수가 나중에 다시 사용될 수 있도록 마치 값처럼 취급된다. 이 특성으로 인해 아래의 기능을 가질 수 있다.

 

 

2-2. 함수를 인자로 다른 함수에 전달할 수 있다.

function callFunction(func) {
    func();
}

// 콜백함수 : 매개변수로서 쓰이는 함수
// 고차함수 : 함수를 인자로 받거나 리턴하는 함수

-위의 코드에서 func 함수는 고차함수이면서 (함수를 인자로 받음) 콜백함수(매개변수로 쓰임)이다.

 

2-3. 함수를 반환할 수 있다.

이와 같은 용도를 partial application 이라고 한다. 이는 함수를 반환하는 함수를 만드는데 사용되며 전달된 첫 번째 매개변수가 리턴값에 저장된다.

 

function createAdder(num) {
    return function(x) {
        return x + num
    }
}

const addFive = createAdder(5); //function(x) {return x + 5}
console.log(addFive(10)); //15

2-4. 객체의 프로퍼티로 할당 가능하다. (method)

 

var warrior = {
    hp: 100,
    strength: 20,
    attack: function(target) {
        target.hp -= this.strength;
    }
}

 

그러나 화살표 함수 객체는 this 바인딩이 불가해 undefined가 뜨기 때문에 주의해야 한다. (아래 코드 참고)

const person = {
    name: 'Jone',
    age: 31,
    isMarried: true,
    sayHello: () => {
        console.log(`Hello ${this.name}`)  //undefined
    }
}

person.sayHello();

 

2-5. 배열의 요소로도 함수를 할당할 수 있다.

const myArr = [
    function(a,b) {
        return a+b
    },
    function(a,b) {
        return a-b
    }
]

console.log(myArr[1](1,2))

 

 

 

 

 

reference: https://developer.mozilla.org/ko/docs/Glossary/First-class_Function

https://soeunlee.medium.com/javascript%EC%97%90%EC%84%9C-%EC%99%9C-%ED%95%A8%EC%88%98%EA%B0%80-1%EA%B8%89-%EA%B0%9D%EC%B2%B4%EC%9D%BC%EA%B9%8C%EC%9A%94-cc6bd2a9ecac