오늘 오전 고차함수 관련 예제를 살펴보다가 아직 개념을 정립하지 못한 것 같아 포스팅을 하기로 하였다.
먼저 일급 객체라는 말부터 생소한데
모던자바스크립트는 아래와 같이 표현하였다.
일급 객체란?
생성, 대입, 연산, 인자 또는 반환값으로서의 전달 등 프로그래밍 언어의 기본적 조작을 제한없이 사용할 수 있는 대상
쉽게 말해 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체이다.
그렇기 때문에 자바스크립트에서는 함수를 매우 유연하게 활용할 수 있다!
일급 객체로서의 함수는 몇 가지 특징이 있는데 아래와 같다.
# 1. 변수에 할당이 가능하다.
const sayHello = function () {
console.log(‘Hello’)
};
sayHello();
위 예제는 함수를 처음 배울 때 함수를 선언하는 방법 중 함수 표현식 이다.
자세히 들여다보면 익명함수를 sayHello라는 변수에 할당하는 식으로 표현되어 있는데 호출 시에도 할당된 변수명을 사용하여야 한다.
변수에 할당이 가능한 것이 어떤 의미인가?
- 함수가 값으로 취급된다.
- 함수가 나중에 사용될 수 있다.
함수가 변수에 할당되었기 때문에 일반적으로 변수를 사용하는 것 처럼 사용이 가능하다 !
# 2. 함수를 인자로 다른 함수에 전달할 수가 있다.
function callFunction (func) {
func() // 매개변수로 받은 변수 = 함수
}
const sayHello = function () {
console.log(‘Hello’)
};
callFunction(sayHello);
위 예제를 살펴보면
callFunction 함수는 다른 함수(func)를 매개변수로 받고 실행한다.
따라서 callFunction 함수를 호출 시 매개변수에 다른 함수가 와야하는데, 위 예제에서는 sayHello라는 함수를 매개변수로 넣고 호출하고 있다. callFunction(sayHello);
결과값을 예상해보자면 ?
callFunction 함수는 매개변수를 받는 함수를 호출한 결과값을 받으니 console.log('Hello') 가 반환되어 콘솔창에 Hello가 찍힐 것이다.
이러한 특징을 아래와 같이 부른다.
- 고차함수 : 함수를 인자로 받거나 return 하는 함수
- 콜백함수 : 매개변수로써 쓰이는 함수
콜백함수는 고차함수에 속한 개념이라고 보면 되는데,
이후 비동기 처리를 위해 사용되는 개념이기에 아주 중요한 녀석이다. 따로 정리할 시간을 갖도록 해야겠다.
# 3. 다른 함수를 반환할 수 있다.
function createAdder(num) {
return function (x) {
return x + num;
};
};
const addFive = createAdder(5);
console.log(addFive(10));
살짝 복잡해 보이지만 천천히 따라가보자 !
1. createAdder 함수는 매개변수(num)를 받아 새로운 함수를 return한다.
2. 새로운 함수는 매개변수 (x)를 받아 기존에 받았던 num과 x를 더한 값을 return한다.
아래 addFive를 풀어서 표현해보자면 아래와 같다.
const addFive = function (x) {
return x + 5;
};
처음 코드블럭에서 addFive는 매개변수 5를 가지는 createAdder를 호출했다.
즉 매개변수 5를 가진 return값을 가지는데 그 return값이 함수였다. (위에서 말한 새로운 함수 !)
그 아래 console.log의 경우 매개변수 10을 지정했기에 앞서 봤던 addFive 의 x값에 10이 할당된다.
따라서 값은 10+5 = 15 가 출력되는 것을 볼 수 있다.
# 4. 객체의 요소로 구성된 함수
const person = {
name : ‘john’,
age : 30,
isMarried: true,
sayHello : function () {
console.log(‘Hello my name is’ + this.name);
}
}
person.sayHello();
// Hello my name is john
처음에 언급한 바와 같이 자바스크립트에서 함수는 일급 객체로 취급되기 때문에 객체의 프로퍼티로 할당 될 수 있고,
그 객체의 메소드로 호출할 수 있다.
(이때 this.name의 경우 this바인딩의 개념으로 자기 자신을 가르킨다.)
this 바인딩이라는 개념 역시 조금은 깊은 내용이기에 별도로 정리하는 시간을 갖도록 하겠다.
우선 이번 포스팅에서는 함수 자체가 객체의 프로퍼티로 할당될 수 있다 정도로 넘어가면 좋을 듯 하다.
#5. 배열의 요소로 구성된 함수
const myArr = [
function (a,b){
return a+b;
},
function(a,b){
return a-b;
};
];
//더하기
console.log(myArr[0](1,3)); // 4
//빼기
console.log(myArr[1](5,2)); // 3
앞서 객체의 요소로도 할당이 가능했다면 배열의 요소로도 할당이 가능하다.
이때 함수를 호출하고자 할 때는 인덱스와 매개변수가 필요하다.
#6. 추가 예제
function multiplyBy(num) {
return function (x) {
return x * num
};
};
function add(x,y) {
return x+y;
};
const multiplyByTwo = multiplyBy(2);
const multiplyByThree = multiplyBy(3);
console.log(multiplyByTwo(10));
console.log(multiplyByThree(10);
const result = add(multiplyByTwo(5), multiplyByThree(10));
console.log(result);
위 부터 천천히 따라가보면
multiplyBy 함수는 num이라는 매개변수를 받고, 새로운 함수를 return한다.
(새로운 함수는 x 매개변수로 받는다.)
해당 함수를 가지고 multiplyByTwo, multiplyByThree 함수를 만들었다.
const multiplyByTwo = function (x) {
return x * 2;
};
console.log(multiplyByTwo(10)); // 20
const multiplyByThree = function (x) {
return x * 3;
};
console.log(multiplyByThree(10); // 30
만들어진 두 함수들을 매개변수로 넣고 add 함수를 호출하는 것도 가능하다.
function add(x,y) {
return x+y;
};
const result = add(multiplyByTwo(5), multiplyByThree(10));
console.log(result);
최종 result 값은 40이 되는 것을 볼 수 있다 !
이처럼 함수가 일급 객체로 활용이 가능하기 때문에 좀 더 다양한 조합으로 사용이 가능하고,
더 간결한 코딩이 가능해지며 유지보수도 쉬워질 수 있다고 한다.
(모듈화된 형태로 작성이 가능하다.)
오늘도 천천히 기본을 쌓아가며 끝판왕에 반발짝 다가갔다.
'자바스크립트 도전' 카테고리의 다른 글
| 자바스크립트_Chapter 15. 얕은 복사 / 깊은 복사 (1) | 2023.11.14 |
|---|---|
| 자바스크립트_Chapter 14. 기본형/참조형 데이터 (0) | 2023.11.13 |
| 자바스크립트_Chapter 11. 전개구문 (Spread) (0) | 2023.11.08 |
| 자바스크립트_Chapter 10. 구조분해할당 (Destructuring) (0) | 2023.11.07 |
| 자바스크립트_Chapter 9. 동기/비동기 vs Block/Non-Block (1) | 2023.11.02 |