본문 바로가기
JavaScript

[JavaScript] 함수형 프로그래밍(Functional Programming), 순수함수, 일급함수, add_maker

by WaterPunch 2021. 9. 20.
 

[무료] 자바스크립트로 알아보는 함수형 프로그래밍 (ES5) - 인프런 | 강의

마플(http://www.marpple.com)의 CTO 유인동님이 알려주는 함수형 프로그래밍에 대한 강좌 입니다. 함수형 프로그래밍으로 라이브러리를 직접 만들어가며 함수형 프로그래밍의 패러다임과 코딩의 즐거

www.inflearn.com

<참고강의>

함수형 프로그래밍이란?

성공적인 프로그래밍을 위해 부수효과를 미워하고 조합성을 강조하는 프로그래밍 패러다임

 

  • 부수효과를 미워한다 -> 순수함수를 만든다 -> 오류를 줄이고 안정성을 높인다
    ※ 순수함수 : 부수효과가 없는 함수(동일한 인자를 넣으면 동일한 결과를 냄), 평가시점이 중요하지 않다
    ※ 부수효과 : 외부의 상태를 변경하는 것
  • 조합성을 강조한다 -> 모듈화를 높인다 -> 생산성을 높인다
"함수형 사고방식은 문제의 해결방법을 동사(함수)들로 구성(조합)하는 것"

 

// 순수함수의 예시
function add(a, b) {
	return a + b;
}

console.log(add(1,2)); // 3
console.log(add(1,2)); // 3
console.log(add(1,2)); // 3


// 얼핏 보면 비슷해 보이지만 밑의 코드는 c라는 인자를 통해 부수효과를 일으키기 때문에 순수함수가 아니다
function add2(a, b) {
	return a + b + c;
}

var c = 10;
console.log(add2(1,2)); // 13
console.log(add2(1,2)); // 13
console.log(add2(1,2)); // 13

var c = 20;
console.log(add2(1,2)); // 23
console.log(add2(1,2)); // 23
console.log(add2(1,2)); // 23

 

일급함수

JavaScript의 특징 중 하나는 함수가 객체이고 일급함수이다

일급함수 : 함수를 언어에서 값으로 다룰 수 있다는 뜻.

   (함수를 변수에 담을 수 있고, 변수에 담은 함수가 값으로 다뤄질 수 있기 때문에, 인자로 넘겨진다거나,

    다른 함수에게 인자로 넘겨져서 그 인자로 넘겨진 함수를 다른 함수가 실행할 수 있다거나 하는 것들)

 

// 일급함수

var f1 = function(a) { return a * a; }
console.log(f1(2)); // 4

var f2 = f1;
console.log(f2);  // f(a) { return a * a; }



function f3(f) {
  return f();
}

console.log( f3(function() { return 10; })); 
// 10

 

예시로 add_maker라는 함수가 있다

※ add_maker는 함수를 리턴하는 함수라는 뜻

function add_maker(a) { 
  return function(b) { // 클로저(closure)
    return a + b; 
  } 
}

var add10 = add_maker(10);
console.log(add10); // f(b) { return a + b; }  << 이곳에서 이미 a는 10이 채워진 상태이다

console.log(add10(20)); // 30  << 남은 b 인자가 20으로 채워지면서 결과값 30이 출력이 된다

일급함수클로저(Closure)가 동시에 사용되었다. 또한 익명함수의 a가 전혀 변경이 되지 않으므로(참조만 함) 

return 되는 익명함수는 순수함수라는 것에 신경을 써야한다

 

클로저(Closure) : 자신이 생성될 때의 환경(렉시컬 스코프(환경))을 기억하는 함수

자유변수 (Free variable) : 클로저를 포함하고 있는 외부함수의 인자, 지역 변수를 말함

                                             외부함수가 종료된 이후에도 사용할 수 있음

                                            (단, 외부에서 직접 접근할 수 없고, 항상 클로저를 통해서만 사용할 수 있다)

스코프 (Scope) : 변수에 접근할 수 있는 범위 (전역(global), 지역(local))

렉시컬 스코프 (Lexical Scope) : 함수를 어디서 호출하는지가 아니라, 어디에 선언하였는지에 따라 결정되는 것

                                                    (함수를 어디서 선언하였는지에 따라 상위 스코프를 결정한다는 뜻)

                                                    (다른 말로 정적 스코프(Static Scope)라고도 함)

 

 

add10은 언제 어디서 불러도 동일한 동작을 기대할 수 있게 되었다.

함수의 평가 시점이 의미가 없다는 사실을 다시 한번 강조

 

function f4(f1, f2, f3) {		// f4 함수는 인자로 f1, f2, f3 함수를 받게 된다
  return f3( f1() + f2());		// f3 함수는 f1, f2의 인자값을 받아 결과값을 return 한다
}

f4(
  function() {return 2;}, 		//f1
  function() {return 1;}, 		//f2
  function(a) {return a * a;}		//f3
)

/* 
function f4(f1, f2, f3) {
  return f3( f1() + f2());  >> return f3( 2 + 1 );  >> return f3(3); >> 결과값 9
}
*/

이와 같은 방식으로 진행하는 것이 함수형 프로그래밍이다

어떠한 원자적 순수함수( 로직에 이상이 없는)들을 조함해 나가는 방식이다

 

이상 없는 함수들을 조합해 큰 로직을 만들어 가는 과정이기 때문에 믿고 재사용 할 수 있다는 큰 강점이 있다

 

함수형 프로그래밍은 애플리케이션, 함수의 구성요소, 더 나아가서 언어 자체를 함수처럼 여기도록 만들고,

이러한 함수 개념을 가장 우선순위에 놓는다

 

 

 

 

참고 블로그

 

함수형 프로그래밍] 정의, 순수함수, 일급함수, add_maker

이 내용은 회사 세미나 준비를 위해 인프런 강의를 보며 정리했다. 근데 인프런 강의를 보는데 조금 반가웠...

blog.naver.com

 

반응형

'JavaScript' 카테고리의 다른 글

[JavaScript] 함수형으로 전환하기 filter, map, each  (0) 2021.09.22

댓글