함수형 프로그래밍의 필수 구성요소 2 - 변수의 불변성

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

모든 함수를 순수 함수(pure function)로 구현하는 것만으로는
모든 걱정을 해결하지는 못한다.
예시를 하나 살펴보자.

원래 리스트의 요소 중 하나를 바꾸기

프로그래밍을 하다보면
변수를 선언하고 변수에 값을 할당하고
변수에 담겨있는 값을 변경하고 하는
이런 과정들이 너무나 자연스러운 행동들이다.
이렇게 변수를 마음껏 추가, 변경, 삭제 가능하다는 사실은
함수형 프로그래밍의 세계에서는 아주 중대한 이슈가 된다.

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

앞에서 봤던 예시를 다시 떠올려보자.
복잡하게 함수를 호출해야 하는 로직이 있다고 생각해보자.
앞에서 모든 함수를 순수 함수(pure function)로 구현하기 때문에
세번째줄 x 에는 처음의 값 a,b,c 를 담은 리스트가 된다고 말했다.
하지만 엄밀하게 말하면 꼭 그렇지는 않다.
함수에서만 부수효과를 없애기로 약속한거지
변수 자체는 언제든지 바꿀 수 있다.
그래서 이 복잡한 로직 가운데 어딘가에
x[1] = 'Q' 처럼
변수 x 에 새로운 값을 할당하는 로직이 숨어있을 수도 있다.
이런 부수효과를 일으키는 동작이 하나라도 있다면
두 개, 세 개 있더라도 전혀 이상하지 않으므로
구현내용을 끊임없이 의심하고 확인해야 하는 어려움이 생긴다.

Immutable

이런 복잡한 상황을 방지하기 위해서
함수형 프로그래밍은 또 하나의 약속을 제시한다.
변수를 언제나 '불변하게(immutable)' 관리하자고 말이다.
'불변하다(immutable)' 라는 말은
어떤 변수에 한번 값을 할당하고 나면
어떤 방법으로도 해당 변수의 값을 바꿀 수 없게 만들자는 것이다.
해당 변수가 참조하고 있는 객체를
변경하는 것이 불가능할 뿐만 아니라
내부의 필드, 프로퍼티, 메타데이터 등
이 변수에 있는 어떤 요소도
추가, 수정, 삭제할 수 없게 만들어야 한다.

하지만 현실적으로는
코드를 작성하다보면 값을 변경하는 경우가 반드시 있다.

Copy-On-Write

이를 위해서 함수형 프로그래머들은
흔히 Copy-On-Write 라는 테크닉을 적용한다.
예를 들어서 리스트 L 을 입력받아서
i 번째 인덱스 요소를 x 로 바꾸는
함수 f(L, i, x) 가 있다고 해보자.
이 함수를 적절한 아규멘트로 호출하는 상황을 상상해보자.
a,b,c 리스트가 있을때 인덱스 1에 있는 요소를 Q 로 바꿔서
a,Q,c 리스트로 바꾸는 로직을 만든다면
다음과 같은 순서로 동작하도록 구현해야 한다.

함수에 원본 리스트 a,b,c 를 전달한다.
-> 원본 리스트를 deep-copy 해서 새로운 리스트 a,b,c 를 만든다
-> 새로운 리스트의 인덱스 1에 있는 요소를 Q 로 바꿔서 a,Q,c 로 만든다
-> 새로운 리스트 a,Q,c 를 반환한다.

Persistent Data Structure

변수의 '불변성(immutability)' 을
보장하는 로직을 매번 새롭게 구현해서
변수를 변경할때마다 스스로 신경써서 원본 데이터를 복제하는 것은
너무 귀찮기도 하고 개인이 실수할 여지를 많이 남긴다.
이런 대부분의 평범한 사용자들을 위해서
코어 라이브러리 개발자들은
불변 자료구조(persisten data structure)를 미리
구현해서 제공한다.

불변 자료구조는
데이터를 저장하고 가공하는 인터페이스는
기존의 자료구조와 비슷하지만
추가, 삭제, 가공할때 '불변성(immutable)' 이라는 특성을
최대한 지키도록 위에서 언급한 Copy-On-Write 방식으로 동작한다.

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

이렇게 해서 함수형 프로그래밍의 필수 구성요소 2가지를 살펴봤다.
함수의 순수성(pure function, 함수의 참조 불변성)과
변수의 불변성(immutability).
여러가지 측면에서 코드 퀄리티 향상에 도움이 되고
개발자에게 두통을 불러오는
다양한 오류를 미연에 방지하는 효과가 있기 때문에
함수형 프로그래밍을 하는지 아닌지와 상관없이
이 두 가지 원리이자 약속을 지키려고 의식적으로 노력하며
코드 작성하는 것을 추천한다.

<참조>
유튜브 영상, Functional Programming in 40 Minutes • Russ Olsen • GOTO 2018

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

0개의 댓글