불변성 (Immutability)
쉽게 풀면
계약서 원본에 직접 줄을 긋고 고치는 대신, 수정할 내용이 있으면 항상 "개정판"을 새로 인쇄해서 쓰는 상황을 떠올려 보세요. 원본은 그대로 보존되고, 누구든 원본을 다시 봐도 내용이 바뀌어 있을 걱정이 없습니다. 불변성은 프로그램의 데이터를 이렇게 다루는 방식입니다. 어떤 값을 만든 뒤에는 그 값 자체를 고치지 않고, 변경이 필요하면 항상 새로운 값을 만들어 사용합니다. 이렇게 하면 여러 부분(또는 여러 스레드)이 같은 데이터를 동시에 들여다봐도 "누가 언제 값을 바꿨는지" 추적할 필요가 없어져 코드를 훨씬 예측하기 쉬워집니다.
왜 중요한가
불변성은 동시성 프로그래밍, 함수형 프로그래밍, 분산 시스템 설계 전반에서 예측 가능하고 검증하기 쉬운 프로그램을 만드는 기본 원칙으로 다뤄지기 때문에 소프트웨어공학 논문에서 반복적으로 등장합니다. 데이터가 변하지 않는다는 보장이 있으면 여러 스레드나 노드가 값을 동시에 참조해도 별도의 동기화 장치 없이 안전하게 공유할 수 있어, 성능과 안정성을 동시에 높이려는 시스템 설계 연구에서 핵심 개념으로 다뤄집니다. 또한 블록체인처럼 기록의 변경 불가능성 자체가 신뢰의 근거가 되는 응용 분야에서도 이 개념이 확장되어 인용됩니다.
논문에서는 이렇게 쓰입니다
이 문장은 데이터를 직접 수정하지 않고 항상 새 값을 만들어 사용하도록 설계함으로써, 여러 스레드가 동시에 같은 데이터를 건드려 생기는 동시성 오류를 피했다는 의미입니다.
값이 바뀌지 않는 자료구조를 쓰면 함수의 동작을 예측하기 쉬워져, 프로그램이 올바른지 수학적으로 증명하는 작업도 수월해진다는 뜻입니다.
한 번 기록된 데이터를 바꿀 수 없게 설계하면, 누군가 몰래 데이터를 조작하려는 시도를 막거나 발견할 수 있다는 뜻입니다.
조금 더 깊게 보면
불변성은 흔히 얕은 불변성(shallow immutability)과 깊은 불변성(deep immutability)으로 구분되는데, 전자는 객체 자체의 참조만 고정하고 내부에 포함된 다른 객체는 여전히 바뀔 수 있는 경우이며, 후자는 내부 구조까지 모두 변경 불가능하도록 만든 경우입니다. 자바의 문자열이나 함수형 언어의 리스트처럼 언어 차원에서 기본적으로 불변으로 설계된 자료구조도 있고, 개발자가 명시적으로 불변 객체를 만들어 쓰는 경우도 있습니다. 불변 자료구조를 효율적으로 구현하기 위해 값 전체를 복사하는 대신 일부 구조만 공유하는 영속 자료구조(persistent data structure) 기법이 함께 논의되곤 합니다.
주의할 점
불변성은 코드를 안전하게 만들어 주지만 공짜가 아닙니다. 값을 바꿀 때마다 새 데이터를 만들어야 하므로 메모리 사용량과 연산 비용이 늘어날 수 있으며, 이는 경쟁 상태를 막는 대신 치러야 하는 트레이드오프입니다.