ES5+함수형-함수형 프로그래밍 개요

Min·2021년 2월 7일
0

JavaScript

목록 보기
15/18
post-thumbnail

자바스크립트로 알아보는 함수형 프로그래밍 (ES5) 강의를 듣고 정리한 내용입니다.

1. 함수형 프로그래밍 정의, 순수함수

1) 함수형 프로그래밍

성공적인 프로그래밍을 위해
부수 효과를 미워하고 -> 순수 함수를 만든다 -> 오류를 줄이고 안정성을 높인다.
조합성을 강조하는 -> 모듈화 수준을 높인다 -> 생산성을 높인다.
프로그래밍 패러다임

2) 순수 함수

  • 부수 효과가 없는 함수, 수학적 함수
  • 들어온 인자가 같으면 항상 동일한 결과를 리턴
  • 함수가 받은 인자 외에 다른 외부의 상태에 영향을 끼치지 않는 함수
  • 리턴값 외에는 외부와 소통하지 않는다.
  • 평가 시점이 중요하지 않다 -> 다양한 로직 생성이 가능
    ex) 동일한 인자를 주었을 때 상황에 따라 다른 값을 리턴하는 함수에서
    변수 c의 변화 전과 후의 평가 시점이 중요하지 않다.
function add(a, b) {
	return a+ b;
}
console.log( add(10, 5) ); // 15
console.log( add(10, 5) ); // 15
console.log( add(10, 5) ); // 15

3) 순수 함수가 아닌 경우

  • 동일한 인자를 주었을 때 상황에 따라 다른 값을 리턴하는 함수
var c = 10; // 이 변수가 변화가 있다면 순수함수가 아니지만
// 상수로서 존재하면 순수 함수이다.
function add2(a, b) {
	return a + b + c;
}
console.log( add(10, 2) ); // 22
console.log( add(10, 3) ); // 23
console.log( add(10, 4) ); // 24
c = 20; // 순수 함수라면
// 이 변수의 변화 전과 후의 평가 시점은 중요하지 않다.
console.log( add(10, 2) ); // 32
console.log( add(10, 3) ); // 33
console.log( add(10, 4) ); // 34
  • 부수 효과를 일으키는 함수
    부수 효과 : 함수가 리턴값으로 결과를 만드는것 외에 외부에 상태에 영향을 미치거나
    들어오는 인자의 상태를 직접 변경하는 함수
var c = 20;
function add3(a, b) {
  	c = b; // 리턴값으로 소통하는 것 외에
  // 어떠한 외부의 상태에 미치는 출력
	return a+ b;
}
console.log(c); // 20
console.log( add3(20, 30) ); // 50
console.log(c); // 30
  • 리턴값이 없고 직접 인자로 들어오는 값의 상태를 직접 변경하는 함수
var obj1 = { val: 10 };
function add4(obj, b) {
	obj.val += b;
}
consoel.log( obj1.val ); // 10
add4(obj1, 20);
consoel.log( obj1.val ); // 30

4) 순수함수로 객체 다루는 방법

원래의 값을 두고 새로운 값을 만들어 복사해서 리턴

var obj1 = { val: 10 };
function add5(obj, b) {
	return { val: obj.val + b } // 리턴 값으로 소통
}
consoel.log( obj1.val ); // 10
var obj2 = add5(obj1, 20);
consoel.log( obj1.val ); // 10
consoel.log( obj2.val ); // 30

2. 일급함수, add_maker, 함수로 함수 실행하기

1) 일급함수

  • 함수를 값으로 다룰 수 있다.
  • 함수를 변수에 담을 수 있고, (다른 함수의) 인자로 보낼 수 있다.
  • 원하는 시점에 평가할 수 있다.

함수가 변수에 담길 수 있다.

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

var f2 = add;
console.log(f2); // function add(a, b) { return a + b;}

함수가 함수의 인자로 받을 수 있다.

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

2) add_maker

함수를 값으로 다루며 순수함수를 정의하면서
함수의 평가시점이 언제든 상관이 없다.

일급함수 + 클로저

function add_maker(a) {
	return function(b) { // 이 함수는 클로저이기도 하다.
    	return a + b;
    }
}
var add10 = add_maker(10);
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

과정

add_maker의 인자로 10을 넘기게 되면 a에 10이 들어가며
add10 은 아래와 같이 된다.

var add10 = function(b) { // 순수 함수
	return a + b; // a의 상태를 변경하고 있지 않으므로 동일한 결과
}

add10의 인자로 20을 넘기면 b에 20이 들어가며
콘솔에 add10(20)의 값 30이 찍힌다.

다른 예제

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

과정

function f4(f1, f2, f3) {
	return f3(2 + 1);
}
f4( // 순수 함수들을 조합해서 결과를 만든다.
	function() { return 2; },
  	function() { return 1; },
  	function(a) { return a * a; })); // a = 3 , a * a = 9

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

요즘 개발 이야기와 타협할 수 없는 생산성

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

스멀스멀 다가오는 FP

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

함수형 프로그래밍 정의

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

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

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

// 함수 기준
moveLeft(dog);
moveRight(duck);
moveLeft({ x: 5, y: 2 };
moveRight(dog);
profile
slowly but surely

0개의 댓글