sharingStorage

Pure function vs Impure function 본문

개념

Pure function vs Impure function

Anstrengung 2022. 1. 10. 15:18

Pure function(퓨어 함수)

pure함수란 다음 두가지 조건을 만족하는 함수이다.

  1.  predictable (예상가능한)
  2.  no side effects (부수효과가 없는)

 

 

predictable 

여기서 predictable이란 퓨어함수가 호출된 횟수에 관계없이 동일한 input은 동일한 output을 반환해야한다는 것이다.

 

no side effects

이것을 이해할면 side effect부터 알아야한다.

side effect의 사전적 의미는 '원래의 목적과 다르게 작용하는 효과'인데 여기서는 '최종 output과 관련없는 함수가 수행하는 작업'으로 생각한다.  (상태의 변화를 나타낸다고도 한다.)

예컨데 덧셈을 하는 add함수가 있는데 그 안에 console.log를 사용해 여러가지 값을 출력한다면 이것은 side effect가 존재하는 함수이며 pure 함수가 아니다. 

=>( 외부에서 선언된 상태(state)를 수정하지 않는다.) state=변수 라고 이해해도 좋다.

 

 

 - side effect에 포함되는 것들

  • Modifying a global variable
  • Modifying an argument
  • Making HTTP requests
  • DOM manipulation
  • Reading/writing files

 

Impure function

비동기는 동기의 반대말인 것 처럼 impure함수는 pure함수의 반대라고 생각하면 된다.

즉 같은 input이 주어졌을 때도 같은 result를 return한다는 것을 예측할 수 없으며 side effect를 일으킬 수 있는 것이 impure함수이다.

 

 

 

Why use Pure function ?
  • pure 함수는 테스트하기 쉽고 예측할 수 있다.
  • Pure함수와 그 결과는 프로그램의 다른 곳에서 상태를 변경하지 않기 때문에 고려하기 용이함 (impure 함수에 비해)
  • pure함수는 기억할 수 있음. 즉 함수가 처음 실행될 때 캐시에 저장되므로 함수를 다시실행시킬 필요없음 -> 최적화에 좋음

 

 

 

JS 함수 중 본질적으로 impure한 것들

  • Math.random()
  • Date.now()
  • arr.splice()
  • arr.push()
  • arr.sort()

 

JS 함수 중 pure함수와 관련있는 것

  • arr.map()
  • arr.filter()
  • arr.reduce()
  • arr.each()
  • arr.every()
  • arr.concat()
  • arr.slice()
  • Math.floor()
  • str.toLowerCase()
  • the spread syntax ...

 

 

끝으로...

퓨어함수는 함수형 프로그래밍의 기초이고 react나 redux 같은 몇몇 라이브러리가 기본적으로 순수함수를 사용해야한다.

AJAX호출이나 DOM  manipulation은 pure함수를 통해 실행될 수 없다.

 

pure함수를 사용하면 예기치 못한 영향을 최소화할 수 있고 결과값을 예측가능하게 한다는 장점이 있다.

 

 

 

Reference

https://dev.to/sanspanic/pure-vs-impure-functions-50aj 

https://velog.io/@nittre/JavaScriptFunction-Composition-Series-1.-Pure-Function 

'개념' 카테고리의 다른 글

localStorage와 sessionStorage  (0) 2022.06.27
HTTP 프로토콜에 대해  (2) 2022.01.14
Synchronous(동기) vs Asynchronous(비동기)  (0) 2022.01.03
Comments