순수 함수

Crowwan·2023년 2월 10일
1
post-thumbnail

함수형 프로그래밍을 처음 공부하게 되면 먼저 접하는 개념이 바로 순수 함수입니다. 프로그래밍 패러다임의 기반이 되는 개념이죠. 그렇다면 순수 함수는 무엇일까요?

순수 함수

순수 함수는 보통 다음 조건을 맞추는 함수를 의미합니다.

  • 순수 함수는 동일한 인자의 값이 입력으로 들어왔을 때 항상 동일한 결과를 반환한다.
  • 순수 함수는 부수 효과를 만들어 내지 않는다.

이외의 조건은 대부분 위의 조건에서 시작되는 것입니다. 예를 들면 return을 통해서만 소통한다는 조건은 부수 효과를 만들지 않고, 동일한 결과를 낸다는 것과 같습니다. 외부의 어떤 값을 인자를 이용하지 않고선 접근하지 않는다는 의미이죠. 뭐 그렇습니다.

순수 함수 예시

그렇다면 순수 함수의 예는 어떤 것이 있을까요?
너무 유명한 예시는 아래의 코드입니다.

const add = (a,b) => a + b;

위의 함수는 언제 어디서 호출하느냐에 구애받지 않고, 같은 입력이면 같은 출력을 내보내게 됩니다. 이런 함수를 순수 함수라고 합니다.

그렇게 하는 이유는 외부의 값에 변화를 주지 않고(불변성) 부수효과를 만들지 않아 테스트가 쉽고, 조합이 용이하기 때문입니다.

불변성

아래의 함수는 순수 함수일까요?

const obj = { name: 'obj' }

const changName = (a) => {
  a.name = 'change';
  return a;
}

결과를 말하면 순수 함수가 아닙니다. 인자를 받아 동일한 인자를 결과로 내보내지만, 객체는 참조 자료형이므로 실제 원본 값이 변경되기 때문에 불변성을 지키지 못하고 있습니다. 즉, 순수 함수가 아니라는 것입니다. 그렇다면 어떻게 코드를 수정해야 할까요? 간단합니다. 참조 자료형을 복사하면 됩니다.

const obj = { name: 'obj' }

const changName = (a) => {
  const res = {...a};
  res.name = 'change'
  return res;
}

위의 함수를 실행하면 언제 실행하는지와 상관없이 동일한 형태의 객체를 반환합니다. 순수 함수가 된 것이죠. 단, 입력으로 들어오는 a의 깊이가 1이어야 합니다. 만약 특정 속성의 값이 참조 자료형이면 문제가 생길 수 있죠. 이런 것을 고려해서 코드를 작성하면 순수 함수를 만들 수 있습니다.

순수 함수를 잘 이용해서 코드를 작성하게 되면 별 다른 테스트없이도 결과를 예측할 수 있습니다.
순수 함수가 아닌 함수들은 함수의 호출 위치와 함수 호출의 횟수에 영향을 받게 됩니다. 그렇기 때문에 실제 함수의 기능을 테스트하는 것도 어려워집니다.

그렇다면 순수 함수를 왜 알고 있어야 할까요? 순수 함수가 사실 의미하고자 하는 것은 수학의 함수와 같은 형태를 의미하는 것입니다. 수학의 함수는 위의 조건을 항상 만족합니다. 하지만 프로그래밍의 경우 함수는 위 조건을 위배하는 경우가 대부분이죠. 그럴 수 밖에 없기 때문입니다.

프로그래밍에서 함수

프로그래밍에서 함수의 의미는 순수 함수와는 개념이 다릅니다. 순수 함수를 포함하는 개념이죠. 그 이유는 위에서 말한 조건을 위배할 수 밖에 없는 상황이 생기기 때문입니다. 프로그래밍을 수학 문제를 풀기 위해서 하는 것이 아니기 때문이죠.

예를 들면 웹이나 앱 사용자에게 알림을 주는 기능을 만든다고 합시다.

const notifyToAll = (users) => {
	users.forEach(user => sendMessage(user,`${user}에게 메시지를 보냅니다`));
}

위의 코드가 대충 있다고 가정하면, users라는 인자를 받아서 sendMessage라는 함수를 통해 알림을 보내고 있습니다. sendMessage함수는 인자가 동일하게 들어오면 동일한 행동을 합니다. 그렇다면 이 함수는 순수 함수일까요? 여기서 알림을 보내는 것은 외부 세상에 어떤 변화를 주는 부수 효과이기 때문에 순수 함수라고 할 수 없습니다. 이렇게 실제 서비스에서는 순수 함수 조건에 맞지 않게 코드를 작성할 수 밖에 없습니다.

그래서 어떻게 사용하는데

사실 위의 순수 함수와 같은 형식으로 모든 코드를 작성하는 것은 절대 불가능합니다. 이유는 아까도 말했듯이 실제 서비스에서는 부수 효과를 반드시 발생시키기 때문입니다. 그렇다면 우리는 순수 함수를 어떻게 사용해야 할까요?

사실 저도 이 부분에 대해 자세하게 설명할 수 없는데, 그 이유는 함수형 사고로 프로그래밍을 하지 못하기 때문입니다. 함수형 프로그래밍을 하기 위해서는 코드를 보는 시각과 문제를 접근하는 방법이 조금은 다릅니다. 어떤 기능을 구현할 때, 액션, 계산, 데이터로 나누어 코드를 구성하죠. 이에 대해서는 제가 좀 더 공부를 하고 포스팅하겠습니다.

profile
어렵게 하는 개발 공부

0개의 댓글