순수 함수

박요셉·2023년 10월 11일

Simple note

목록 보기
2/18

함수형 언어 분야에서 순수 함수(pure function)는 다음 요건을 만족해야 한다.
만약 다음 요건을 만족하지 않으면 불순 함수(impure function)라고 하며, 다음 요건을 만족하지 않는 경우를 부작용(side-effect)이라고 한다

  • 함수 몸통에서 입력 매개변수의 값을 변경하지 않는다.
    즉, 입력 매개변수는 상수나 읽기 전용으로만 사용한다.
  • 함수는 함수 몸통에서 만드어진 결과를 즉시 반환한다.
  • 함수 내부에 전역 변수나 정적 변수를 사용하지 않는다.
  • 함수가 예외를 발생시키지 않는다.
  • 함수가 콜백 함수 형태로 구현되어 있거나, 함수 몸통에 콜백 함수를 사용하는 코드가 없다.
  • 함수 몸통에 Promise처럼 비동기 방식으로 동작하는 코드가 없다.
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인 아이템을 제거한 새로운 배열을 반환하므로 정상으로 구현한 예이다.

profile
개발자 지망생

0개의 댓글