함수형 언어 분야에서 순수 함수(pure function)는 다음 요건을 만족해야 한다.
만약 다음 요건을 만족하지 않으면 불순 함수(impure function)라고 하며, 다음 요건을 만족하지 않는 경우를 부작용(side-effect)이라고 한다
const add = (a: number, b: number) => a+b
add(1,2)처럼 호출할 때 항상 3을 반환하므로 순수 함수이다.
불순 함수 예1
const impureReducer = (state, action) => {
state += action.payload
return state
매개변수 state의 값을 변경하므로 이 리듀서는 불순 함수가 된다.
순수 함수 예 1
const pureReducer = (state, action) => {
return state + action.payload
state 값을 유지하므로 리듀서를 정상으로 구현한 예이다.
불순 함수 예 2
const impureReducer2 = (state, action) => {
state.name = 'Jack'
return state
다음 리듀서는 입력 매개변수 state값을 변경하므로 리듀서를 불순 함수로 만드는 또 다른 예이다.
const pureReducer2 = (state, action) => {
return {...state, name: 'Jack'}
반면에 다음 리듀서는 전개 연산자로 과거 state를 깊은 복사하여 새로운 state 객체를 만들고, 이 새로운 state 객체의 name 속성만 바꾸므로 정상으로 구현한 예이다.
불순 함수 예 3
const impureReducer3 = (state, action) => {
state.push({name : 'Jack', age: 32})
return state
다음 리듀서는 입력 매개변수 state값을 변경하므로 리듀서를 불순 함수로 만드는 또 다른 예이다.
const pureReducer3 = (state, action) => {
return [...state, {name: 'Jack', age: 32}]
반면에 다음 리듀서는 전개 연산자로 과거 state 배열을 깊은 복사하여 새로운 state 배열을 만들고, 이 새로운 state 배열 객체에 새 아이템을 추가하므로 정상으로 구현한 예이다.
불순 함수 예 4
const impureReducer4 = (state, action) => {
const index = 0
state.splice(index, 1)
return state
}
다음 리듀서는 입력 매개변수 state값을 변경하므로 리듀서를 불순 함수로 만드는 또 다른 예이다.
순수 함수 예 4
const pureReducer4 = (state, action) => {
return state.filter((item,index) => index !== 0)
}
반면에 다음 리듀서는 배열의 filter() 메서드를 사용하여 index값이 0인 아이템을 제거한 새로운 배열을 반환하므로 정상으로 구현한 예이다.