You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
부수 효과란 함수의 핵심 목적에서 벗어나 외부 세계에 영향을 주는 행위가 포함된 함수이다. 외부 세계와 영향을 주고 받기 때문에 항상 같은 결과를 반환할 것이라 장담하기 어렵다.
함수형 프로그래밍에서 부수 효과(Side Effect)는 함수의 실행 결과로서 함수 외부의 상태를 변경하거나 다른 외부 환경에 영향을 주는 것을 말한다. 부수 효과는 주로 변수의 값 변경, 파일 입출력, 네트워크 요청, 데이터베이스 접근 등의 작업을 포함한다.
부수효과 예시
let counter = 0;
function increment() {
counter++;
}
increment();
console.log(counter); // 1
위의 예시에서increment 함수는 counter 변수를 변경하는 부수 효과를 가지고 있다. 함수가 실행되면 counter 변수의 값이 증가하게 된다. 이는 함수 외부의 상태를 변경하는 부수 효과이다.
부수 효과는 함수형 프로그래밍에서 지양하는 개념. 순수 함수를 사용하여 부작용을 최소화하고 예상치 못한 동작을 줄이는 것이 목표이다. 부수 효과가 있는 코드는 예측이 어렵고 디버깅이 어렵게 만들며, 코드의 가독성과 테스트 용이성을 저하시킬 수 있다.
함수형 프로그래밍에서는 부수 효과를 제어하기 위해 순수 함수와 불변성(Immutability)을 강조한다. 순수 함수는 부수 효과를 발생시키지 않으며, 입력과 출력 사이의 관계가 명확한다. 불변성은 데이터의 변경을 허용하지 않고, 새로운 데이터를 생성하는 방식으로 작업을 수행한다.
불변성 ex) map(), filter()
부수 효과를 최소화하고 순수 함수를 사용함으로써 코드의 안정성과 예측 가능성을 높일 수 있다. 이를 통해 코드의 가독성과 유지보수성을 향상시키고, 병렬 처리와 테스트 용이성을 강화할 수 있다.
순수 함수(Pure Function)
순수 함수란 입력 값에 대해 항상 동일한 출력값을 반환하며, 부수 효과가 없는 함수이다. 또한, 리액트 컴포넌트를 밖으로 빼둔 것도 순수함수라고 한다. 즉, 어떤 함수에 동일한 인자를 주었을 때 항상 같은 값을 리턴하는 함수
function add(a,b){
return a + b;
}
console.log( add(10,5) );
add는 순수함수이다. 언제, 어디서 실행해도 add(10,5)는 항상 15를 리턴하고 외부 상태를 변경하지 않았기 때문임
var c = 10;
function add2(a,b){
return a + b + c;
}
console.log(add2(10,3));
console.log(add2(10,3));
c = 20;
console.log(add2(10,3));
// 순수함수 아님 c가 만약에 상수면 add2도 순수함수.
add2는 순수 함수가 아니다. 함수내에서 외부의 c라는변수 값이 변하면 결과값도 달라지기 때문이다. 만약 c가 상수 즉, 변하지 않는 수라면 add2는 순수 함수다. 외부의 값을 참조해도 결과값이 동일한 인자에 대해서 같기 때문이다.
var c = 20;
function add3(a,b){
c = b; // 외부상태에 영향을 미치네? = 부수효과
return a + b;
}
console.log('c : ',c);
console.log(add3(20,30));
console.log('c : ',c);
add3는 순수 함수가 아니다. 함수가 외부의 값을 변경하는 코드를 가지고 있기 때문에 리턴하는 값이 항상 일정하더라도 외부의 상태를 변경하는 코드가 있으면 순수 함수가 아니다.
Math.random()은 순수함수가 아니다.
Math.random, new Date는 순수 함수가 아니다.
Math.random()은 아무런 인자를 입력하지 않았음에도 함수를 호출할 때마다 결과가 매번 달라진다. 그래서 순수함수가 아니다. 만약 순수함수가 되려면 아무런 인자를 입력하지 않아도 출력 결과는 매번 똑같아야 한다.