오늘도 삽질중

고차 함수( 특별대우를 받는 함수, 고차 함수란?) 본문

[Js Node]/고차함수

고차 함수( 특별대우를 받는 함수, 고차 함수란?)

해빋 2021. 9. 4. 20:04

<목차>

  • 특별대우를 받는 함수
  • 고차함수란?

 


특별대우를 받는 함수

자바스크립에서도 특별 대우를 받는 객체들이 있는데, 그 중의 하나가 함수이다.

어떤 특별 대우를 받을까? 

 

  •  변수에 할당(assignment) 가능,  자료구조(객체,배열 등에)저장 가능
  • 다른 함수의 인자(argument)로 전달 가능
  • 다른 함수의 결과로서 리턴 가능(함수의 반환값 사용가능)

함수를 변수에 할당할 수 있기 때문에, 함수를 배열의 요소나 객체의 속성값으로 저장할 수 있다.

(함수의 데이터를 string, number, boolean, array, object)를 다루듯이 다룬다.

1. 변수에 함수 할당경우


// square 변수에 함수를 할당
const square = function(num){

       return num*num;

}

// square에는 함수가 저장되어 있으므로 (일급 객체), 함수 호출 연산자 '()'를 사용 할 수 있다.

output = square(7);

console.log(output); // --> 49

위의 함수 표현식(function expression)은 함수 선언식(function declaration)과는 다르게 호이스팅이 적용되지 않는다.


고차함수란?

 함수를 인자(argument)로 받는 함수,  함수를 리턴하는 함수

 

콜백함수(callback function): 다른 함수(caller)의 인자(argument)로 전달되는 함수. 말 그대로 호출의 의미가 담긴 함수. 콜백 함수를 전달받은 고차함수는, 함수 내부에서 이 콜백 함수를 호출(invoke)할 수 있다. caller은 조건에 따라 콜백 함수의 실행 여부를 결정할 수 있다. 호출 하지 않을 수도 있고 여러번 실행할  수도 있다. '함수를 리턴하는 함수'인 만큼 커리 함수라고도 부른다. 따로 커리 함수라는 용어를 사용하는 경우에는, 고차함수란 용어를 '함수를 인자로 받는 함수'에만 한정해 사용하기도 한다. 

그러나 엄격히 말을 한다면 고차함수가 커리함수를 포함한다.

 

1. 다른 함수를 인자로 받는 경우

function kiki(num) {
	return num * 2;
}

function koko(func,num) {
	return func(num)
}

// 함수 koko는 다른 함수를 인자로 받는 고차 함수이다.
// 함수 koko의 첫 번째 인자 func에 함수가 들어올 경우
// 함수 func는 함수 koko의 콜백 함수이다.
// 아래와 같은 경우, 함수 kiki는 함수 koko의 콜백 함수이다.

let output = koko(kiki,4);
console.log(output); // -> 8

2. 함수를 리턴하는 경우

function tata(tomato) {
	return function(num){
		return num + tomato;
   };
 }
 
 // 함수 tata는 다른 함수를 리턴하는 고차 함수이다.
 // tata는 인자 한 개를 입력받아서 함수(익명 함수)를 리턴한다.
 // 리턴되는 익명 함수는 인자 한 개를 받아서 tomato와 더한 값을 리턴한다.
 
 // tomato(5)는 함수이므로 함수 호출 연산자 '()'를 사용할 수 있다.
 let output = tata(5)(3) // -> 8
 console.log(output); // -> 8
 
 // tata가 리턴하는 함수를 변수에 저장할 수 있다.
 // javascript에서 함수는 일급 객체이기 때문이다.
 const orange = tata(3);
 output = orange(2);
 console.log(output); // -> 5

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

function double(num) {
	return num * 2;
}

function doubleAdder(added, func) {
    const doubled = func(added);
    return function(num) {
    	return num + doubled;
  };
 }
 //doubleAdder은 고차함수이다.
 //doubleAdder의 인자 func는 함수 doubleAdder의 콜백 함수이다.
 //함수 double은 함수 doubleAdder의 콜백으로 전달되었다. 
 
 //doubleAdder(5, double)은 함수이므로 함수 호출 기호 '()'를 사용할 수 있다.
 doubleAdder(5, double)(3); // -> 13
 
 //doubleAdder가 리턴하는 함수를 변수에 저장할 수 있다.(일급객체)
 const addTwice3 = doubleAdder(3,double);
 addTwice(2); // -->8

'[Js Node] > 고차함수' 카테고리의 다른 글

고차함수(filter, map, reduce ..)  (0) 2021.09.05
Comments