관리 메뉴

개발캡슐

[JS] 순수 함수(pure function), 비순수 함수 본문

용어 및 개념 정리/javascript

[JS] 순수 함수(pure function), 비순수 함수

DevGreeny 2023. 4. 5. 12:24

순수함수

순수함수(pure function)

- 어떤 외부 상태에 의존하지않고 변경하지도 않는, 부수 효과가 없는 함수야.
즉, 동일한 인수가 전달되면 언제나 동일한 값을 반환하고 전달된 인수에게만 의존해 반환값을 만들어.
- 부작용(side-effect)이 없는 함수, 즉 함수의 실행이 외부에 영향을 끼치지 않는 함수야.

그래서 순수 함수는 스레드 안전하고, 병렬적인 계산이 가능해.

외부 상태 : 전역 변수, 서버 데이터, 파일, Console, DOM 등이 있어.
스레드 안전
- "하나의 함수"가 한 스레드로부터 "호출"되어 실행 중일 때,
"다른 스레드가 그 함수를 호출"하여 "동시에 함께 실행"되더라도
각 스레드에서의 함수의 "수행 결과가 올바로 나오는" 것.

 

- return 값으로만 소통해.
- 순수함수는 평가 시점이 중요하지 않아.
순수함수가 아니라면(비순수함수) 동일한 인자를 넣어도 다른 값이 나오는 경우,
어떠한 시점에서 함수를 평가할 지가 굉장히 중요한데,
순수함수동일한 인자를 넣으면 항상 같은 값이 나오기 때문에 굳이 평가시점을 따질 필요가 없어.

- ※ 외부 상태에는 의존하지 않고 함수 내부 상태에만 의존한다고 해도
그 내부 상태가 호출될 때마다 변화하는 값이면 순수 함수가 아니야.

 

순수함수 

<예시 1> 

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

 

<예시 2> 

var count = 0; //현재 카운트를 나타내는 상태

// 순수 함수 increase는 동일한 인수가 전달되면 언제나 동일한 값을 반환해.
function increase(n){
	return ++n;
}

// 순수 함수가 반환한 결과값을 변수에 재할당해서 상태를 변경
count = increase(count);
console.log(count); //1

count = increase(count);
console.log(count); //2

- 순수함수는 오직 매개변수를 통해 함수 내부로 전달된 인수에게만 의존해 반환값을 만들어
- 순수함수가 반환간 결과값을 변수에 재할당해서 상태를 변경해.


비순수 함수

비순수 함수(Impure Function)

- 외부상태에 의존하거나 외부 상태를 변경하는, 부수효과가 있는 함수야.
즉, 외부 상태에 따라 반환값이 달라지고 함수의 외부상태를 변경하는 부수효과가 있어.

 

순수함수가 아닌경우(비순수 함수)

<예시 1> 

let c = 10;
function add2(a, b){
	return a + b + c;
}

console.log(add2(5,5)); //20

c = 15;
console.log(add2(5,5)); //25

- 항상 동일한 인자가 들어가도 전역변수인 c값에 따라결과값이 달라질 수 있어.

 

var count = 0; //현재 카운트를 나타내는 상태 : increase함수에 의해 변화해.

//비순수 함수
function increase(){
	return ++count; //외부 상태에 의존하며 외부상태를 변경해.
}


// 비순수 함수는 외부 상태(count)를 변경하므로 상태 변화를 추적하기 어려워져.
increase();
console.log(count); //1

increase();
console.log(count); //2

 

매개변수를 통해 객체를 전달받으면 비순수 함수가 돼.
순수 함수를 사용하는 게 좋아.
함수형 프로그래밍은 외부 상태를 변경하는 부수효과를 최소화해서
불변성(immutable)을 지향하는 프로그래밍 패러다임이야.

함수형 프로그래밍은 순수 함수를 통해 부수 효과를 최대한 억제해서
오류를 피하고, 프로그램의 안정성을 높이는 노력의 일환이지.

 

 

-참고자료-

더보기