[Functional JS] 함수형 프로그래밍, 순수함수, 일급함수, 요즘 개발 이야기

함수형 프로그래밍 개요

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

성공적인 프로그래밍

  • 모든 프로그래밍 패러다임은 성공적인 프로그래밍을 위해 존재한다.
  • 성공적인 프로그래밍은 좋은 프로그램을 만드는 일이다.
  • 좋은 프로그램은 사용성, 성능, 확장성, 기획 변경에 대한 대응력 등이 좋다.
  • 이것들을 효율적이고 생산적으로 이루는 일이 성공적인 프로그래밍이다.

함수형 프로그래밍

함수형 프로그래밍은 성공적인 프로그래밍을 위해 부수효과를 미워하고(지양하고) 조합성을 강조하는 프로그래밍 패러다임이다.

  • 부수 효과를 미워한다 –> 순수 함수를 만든다.
  • 조합성을 강조한다. –> 모듈화 수준을 높인다.
  • 순수 함수 –> 오류를 줄이고 안정성을 높인다.
  • 모듈화 수준이 높다. –> 생산성을 높인다.

함수형 프로그래밍에서는 원래 초기화되어 있는 값을 건드리지 않고, 모든 값들에 대한 변화를 일으키지 않고, 외부의 상태를 변경시키지 않고, 인자로 받은 값을 변경시키지 않으면서 값을 다루는 프로그래밍 방법이다.

순수 함수

함수가 리턴값으로 결과를 만드는 것 외에, 외부의 상태에 영향을 미치는 것을 ‘부수효과’ 라고 한다. 이러한 부수효과가 없는 함수를 순수함수라고 한다.

또한, 동일한 인자를 줬을 때 항상 같은 결과를 리턴하면 순수함수이다.

순수함수는 ‘평가(evaluate) 시점이 중요하지 않다’는 특징을 갖는다. –> 함수형 프로그래밍이 가능한 이유가 된다.

순수함수가 아닌 함수는 평가 시점에 따라 리턴값이 변할 수 있다.

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

console.log(add(10, 5));

/* 순수하지 않은 함수 add2 */
// 프로그램이 동작하는 중 c값이 변한다고 가정하면 순수하지 않은 함수이고, c값이 상수로 변하지 않는다고 가정하면 순수함수이다.
var c = 10;
function add2(a, b) {
    return a + b + c;
}
console.log(add(10, 2));
console.log(add(10, 3));
console.log(add(10, 4));
c = 20;	// 여기서 c값이 변하기 때문에 순수하지 않은 함수가 된다.
console.log(add(10, 2));
console.log(add(10, 3));
console.log(add(10, 4));

/* 부수효과가 있는 함수 (not 순수함수) */
var c = 20;
function add3(a, b) {
    c = b;	// 외부의 상태에 영향을 미치기 때문에 부수효과가 생긴다.
    return a + b;
}

/* 부수효과가 있는 함수2 (not 순수함수) */
var obj1 = { val: 10 };
function add4(obj, b) {
    obj.val += b;	// 인자의 상태를 직접적으로 변경하기 때문에 부수효과가 생긴다.
}

/* 순수 함수 add5 */
var obj1 = {val: 10};
function add5(obj, b) {
    return {val: obj.val + b}	// 변수 obj를 인자로 받아서 val 속성을 참조만 할 뿐 직접적으로 변경하지 않는다. 따라서 외부 상태도 변경되지 않는다. 그래서 순수함수인 것이다.
}

일급 함수

함수를 값으로 다룰 수 있다는 개념이다.

함수를 변수에 담을 수도 있고, 변수에 담은 함수가 값으로 다뤄질 수 있기 때문에 인자로 넘겨진다거나, 인자로 넘긴 함수를 다른 함수에서 실행할 수도 있다.

일급 함수는 함수를 값으로 계속 가지고 다니다가 원할 때 평가를 할 수 있다.

/* 일급 함수 */

// 1. 함수를 정의해서 변수에 담을 수 있다.
var f1 = function(a) {
    return a * a;
};

// 2. 기존에 정의된 함수를 변수에 담을 수 있다.
var f2 = add;

// 3. 인자로 함수를 받아서 실행할 수 있다.
function f3(f) {
    return f();
}

f3(function() {return 10;});  // 10

[예제] add_maker

function add_maker(a) {
    // 인자로 들어온 변수 a는 리턴하는 함수에서 참조만 할 뿐, 변경하지 않기 때문에 항상 동일한 값을 가리킨다. 따라서 언제 평가해도 같은 결과값이 나오는 순수함수가 된다.
    return function(b) {
        return a + b;
    }
}

var add10 = add_maker(10);
// var add10 = function(b) { return 10 + b };
// add10은 a값을 기억하고 있는 클로저가 된다.

console.log(add10(20));  // 30

var add5 = add_maker(5);
var add15 = add_maker(15);

console.log(add5(10));	// 15
console.log(add15(10)); // 25
/* 함수로 함수를 실행하는 예제 */
function f4(f1, f2, f3) {
    return f3(f1() + f2());
}

f4(
	function() {return 2;},
    function() {return 1;},
    function(a) {return a * a;}
)	// 9

요즘 개발 이야기, 함수형 프로그래밍 정의

요즘 개발 이야기

특징 예시
재미 / 실시간성 라이브 방송, 실시간 댓글, 협업, 메신저
독창성 / 완성도 애니메이션, 무한 스크롤, 벽돌형태의 리스트
더 많아져야하는 동시성 비동기 I/O, CSP, Actor, STM …
더 빨라야하는 반응성 / 고가용성(절대 죽지 않는 서비스) ELB, Auto Scaling, OTP Supervisor …
대용량 / 정확성 / 병렬성 MapReduce, Clojure Reducers …
복잡도 / MSA / … 많아지고 세밀해지는 도구들

이런 것들도 중요하지만 무엇보다 중요한 것은 ‘생산성’

스멀스멀 다가오는 함수형 프로그래밍

  • 좋아지는 하드웨어 성능
  • 좋아지는 컴파일러
  • 함수형 프로그래밍 기술의 발전
  • 좋아지는 분산 / 리액티브 환경
  • 동시성 + 병렬성 관련 기술
  • 성공적인 적용 사례와 영향

이러한 이유들로 인해 함수형 프로그래밍이 더욱 필요해지고, 자주 사용되고 있다.

함수형 프로그래밍은 애플리케이션, 함수의 구성요소, 더 나아가서 언어 자체를 함수처럼 여기도록 만들고, 이러한 함수 개념을 가장 우선순위에 놓는다.”

함수형 사고방식은 문제의 해결 방법을 동사(함수)들로 구성(조합)하는 것” \

  • 마이클 포거스 [클로저 프로그래밍의 즐거움]에서 …

객체지향 프로그래밍 vs 함수형 프로그래밍

/* 데이터(객체) 기준 */
duck.moveLeft();
duck.moveRight();
dog.moveLeft();
dog.moveRight();

/* 함수 기준 */
moveLeft(dog);
moveRight(duck);
moveLeft({x: 5, y: 2});
moveRight(dog);
  • 객체지향 프로그래밍 : 데이터를 먼저 만들고, 그 데이터에 맞는 메서드를 만드는 방식으로 프로그래밍 한다.
  • 함수형 프로그래밍 : 함수를 만들고, 그 함수에 맞게 데이터셋을 구성한다.

댓글남기기