본문 바로가기

개발/개발의 ㄱ

[Js] 순수함수란

반응형

함수형 프로그래밍에서 불변성과 더불어 중요한게 순수함수다.

순수함수는 아래와 같은 조건을 가진다

 

  • 같은 입력에 대해서 같은 결과를 return해야 한다
  • 함수의 바깥 영역에 side effect를 초래하지 않아야한다
  • return을 해야한다

 

여러 글들에서 순수 함수를 다루지만 핵심은 부수효과를 없애 side effect를 지우고, 재사용 가능한 모듈화 이다.

*부수효과란, '외부 상태를 변경하는 것 또는 함수로 들어온 인자의 상태를 직접 변경하는 것'

 

 

(1) 순수 함수인 경우

const adder = (a,b) => {
	return a+b;
}

어떤 사람은 입력과 결과값이 같아야한다고 한다. 이는 a,b를 넣어 a+b로 나오는게 모습을 비순수함수로 판단할 여지가 있기에, 동일한 입력을 넣으면 항상 같은 결과가 나와야한다로 이해하는게 좋다.

 

(2) 비순수 함수인 경우

// case1
const adder= (a,b) => {
	return a+b+Math.random();
}

// case2
const adder= () => {
	const a = 1, b= 2;
	return a+b+Math.random();
}

// case3
const ob = {
	key: 0,
    key1: 0
}

const adder= (a,b) => {
	ob.key = 1
	return a+b;
}

// case4
const ob = {
	key: 0,
    key1: 0
}

const adder= (a,b) => {
	return a+b+ob[key];
}

각 case별 순수 함수가 못되는 이유

case 1: Math.random()에 따라 리턴 값이 항상 달라진다.

case2: 입력 인자가 없다.

case3: 외부 객체 ob에 값을 변경한다.

case4: 외부 객체 ob값을 가져온다.

 

(3) 비순수 -> 순수

// case1
const adderWithRandom= (a, b) => {
	return a+b+randomGenerater();
}

// case4
const ob = {
	key: 0,
    key1: 0
}

const adder= (a,b, ob) => {
	return a+b+ob[key];
}

case1은 adderWithRandom으로 식별자를 바꿔, 더하되 난수를 가미해주는 의미를 부여한다. 

case4는 ob값을 인자로 받아, adder함수에서 객체의 값을 로직에 추가함을 부여한다.

 

 

요약

-순수 함수의 목적, '부수효과를 없애 side effect를 지우고, 재사용 가능한 모듈화 '을 기억하자

-함수 내외부 범위를 의식해야 상태에 대한 side effect를 지울수 있다

 

 

이상입니다

 

*코드가 깨지면 아래 링크를 참조해주세요

https://medium.com/%EB%8F%84%EA%B9%A8%EB%B9%84-%EC%9D%B4%EC%95%BC%EA%B8%B0/js-%EC%88%9C%EC%88%98%ED%95%A8%EC%88%98%EB%9E%80-14a75a0eeefe

'개발 > 개발의 ㄱ' 카테고리의 다른 글

[Js] ES5 prototype vs ES6 Class  (1) 2023.06.26
[Js] 유사배열객체  (0) 2023.06.23
[Js] 함수형 프로그래밍 vs 객체지향 프로그래밍  (0) 2023.06.23
RESTful api란  (0) 2023.06.22
[AWS] auto-scaling 구현 정리  (0) 2023.01.18