함수형 프로그래밍의 필수 구성요소 1 - 함수의 순수성

Raymond Yoo·2023년 12월 11일
0
post-thumbnail

함수형 프로그래밍을 지탱하는 두 개의 큰 축이 있다.

  • (1) 함수의 순수성(참조 투명성)을 보장하는 것
  • (2) 변수의 불변성을 보장하는 것

이 두 가지가 함수형 프로그래밍의 80% 이상을 구성한다.
아무리 화려한 수식과 현란한 함수형 테크닉을 사용하더라도
함수의 순수성, 변수의 불변성 둘 중에 하나라도 보장하지 못한다면
함수형 프로그래밍과는 한참 동떨어진 코드라고 봐야 한다.

(1) 함수의 순수성

함수의 순수성 이라는 말에서 제일 먼저 보이는 단어는 함수 라는 단어다.
함수란 무엇일까??

함수 설명 A —f—> B

함수는 두 집합 사이의 관계를 설명하는 대수적 개념으로
A 라는 모든 요소 각각을 B 에 속한 하나의 요소로
사상할 수 있는 상태를 의미한다.
프로그래밍 용어로 번역해보자면 어떤 함수 f 에
파라미터로 A 집합에 속한 요소 중 하나를 전달한다면
B 집합에 속한 요소 중 하나를 반환한다는 의미가 된다.

흔히 이렇게 수학적 함수에 가까운 함수를
함수형 프로그래밍에서는 '순수 함수(pure function)' 라고 부른다.

프로그래밍 관점에서 '순수 함수(pure function)' 란 무엇일까??
함수 내에서 발생하는 부수효과(side effect)가 없는 함수를 의미한다.
사이드 이펙트, 부수 효과는 다음과 같은걸 말한다.

  • 변수에 새로운 값 할당
  • 자료구조를 in-place 로 변경
  • 오브젝트의 어떤 필드에 값 세팅
  • 예외 던지기
  • 오류 발생으로 인한 프로그램 중단
  • 콘솔 입출력
  • 파일 입출력
  • 네트워크 통신
  • 스크린에 그림 그리기, UI 렌더링

함수 내에 위에서 언급한 것들처럼
함수 스코프를 벗어나서 영향을 끼치는 게 있다면
그 함수는 비순수 함수(impure function)가 된다.
함수형 프로그래밍에서는 순수하지 않은 함수(impure function)를
바람직하지 않은 것으로 보고 비순수 함수를 최소화하려고 노력한다.

함수형 프로그래밍에서는 순수 함수를 왜 강조하는지 궁금할 것이다.
에를 들어서 아래와 같은 코드가 있다고 생각해보자.

간단한 함수를 호출하는 코드

처음에 x 라는 변수에 a,b,c 세 개의 요소를 담고 있는
배열 또는 리스트가 있다고 가정해보자.
이 x 를 아규먼트로 전달해서 함수 a 를 호출하고 결과값을 y 로 받았다.
이 상태에서 x 에는 어떤 값이 들어있을까?
함수 a 를 호출하기 전 상태인 a, b, c 세 개짜리 리스트일까?
아니면 내부 요소가 바뀌어서 d, e, f 리스트가 되었을까?
이를 알아내려면 a 함수의 내부 구현코드를 열어서
처음부터 끝까지 한 줄씩 확인해야 한다.
중간에 파라미터로 받은 변수 x 를 변경하는 코드가
있는지 없는지 파악한다.
그렇게 하고 나서야 확신을 갖고 마지막줄 x 에 무엇이 들어있는지
말할 수 있게 된다.

다른 예시를 보자.

복잡한 함수를 호출하는 코드

이번에는 함수 하나만 간단하게 호출하는게 아니고
y 변수의 값을 얻기 위해서 이렇게 복잡하게 함수를 호출한다고 가정해보자.
이때는 마지막줄 x 에 무엇이 들어있는지 어떻게 알 수 있을까?
함수를 하나씩 다 확인하면서 어떻게 구현했는지 확인하면 될까??
하지만 각각의 함수가 엄청나게 복잡하고 미묘한 로직으로 가득해서
파악하는게 너무나 부담스럽다면?
이런 상황이 발생하는 것을 방지하기 위해서
함수형 프로그래밍은 하나의 약속을 제시한다.
함수를 언제나 '순수 함수(pure function)'로 구현하자고 말이다.
'순수 함수(pure function)' 는 부수효과가 없으므로
함수 내부에서 값을 변경하는 경우가 없다.
설령 함수 내부에서 선언한 변수들의 값을 마음껏 변경하더라도
함수 외부에서 선언한 변수들의 값은 변경하지 않기로 약속했으므로
복잡한 함수 호출을 완료한 뒤에도
마지막줄 x 에 처음에 할당한 값 a,b,c 리스트가
그대로 들어있다고 말할 수 있다.
이 약속을 꾸준히 지킨다면
작업을 할때마다 함수 내부구현을 일일이 들여다봐야하는
고통과 귀찮음을 덜어낼 수 있다.

함수형 프로그래밍의 첫번째 약속, 첫번째 필수요소, 함수의 순수성 보장

함수를 구현할때 언제나 순수 함수가 되도록 하는 것
함수의 순수성을 보장하는 것이 바로 빈 칸에 들어갈 첫번째 요소이다.

<참조>
유튜브 영상, No Nonsense Monad & Functor - The foundation of Functional Programming by César Tron-Lozai
유튜브 영상, Functional Programming in 40 Minutes • Russ Olsen • GOTO 2018

profile
세상에 도움이 되고, 동료에게 도움이 되고, 나에게 도움이 되는 코드를 만들고 싶습니다.

0개의 댓글