불변(Immutable) 개체는 어떤 장점이 있을까요?

.NET 6 의 기본 템플릿 설정으로 nullable 참조 형식을 기본 설정으로 사용할 수 있게 되면서, 과거의 방식으로는 수많은 경고 메시지를 맞이하게 됩니다.

nullable 참조형식은 값이 널인 상태를 지향하고, 널일 수 있음을 string?형태로 명시하도록 하는데요, 이와 같은 현대언어의 또다른 특징으로 C# 9부터 추가된 record의 약식 정의 방식은 불변 값 만을 지원합니다.

record Point(int X, int Y); // 속성 X, Y는 불변

또한 생성자에서 초기화 되는 필드 또는 속성의 경우 readonly 키워드를 필드 또는 속성에 쓸 수 있는데요, 이는 값이 초기화 된 이후 변경되지 않음을 보장합니다.

        class UserInfo
        {
            public readonly string _name;
            public string Name => _name;

            public UserInfo(string name) => _name = name;
        }

Rust 언어의 경우, 변수(또는 필드)를 변경 가능하게 만들기 위해 mut 키워드를 굳이 적어줘야 합니다. 이외에도 버그를 유발할 수 있는 경우는 컴파일 오류를 발생하게 해 원천적으로 댕글링 참조가 되지 않도록 합니다.

이에 반해 C#은 Rust 언어에 비해 유연한 언어라고 할 수 있지만 그만큼 오용한다면 버그를 양산할 수 있게 됩니다.

불변개체를 사용하게 되면 상태에 대한 예측이 가능해져 코드 동작을 좀 더 이해하기 쉽게 짤 수 있습니다.

불변개체는 사실 함수 언어에서 넘어왔다고 할 수 있습니다. 함수언어는 함수의 입력과 처리후의 출력의 과정이 예측 가능하도록 하기 때문에 불변성이 거의 필수라고 하는데요, C# 같은 객체지향 언어에서는 불변개체 개념이 좀 늦게 도입이 된 샘입니다.

하지만 상태가 변할 때마다 불변개체를 새로 생성하는 것 또한 무거운 비용이기 때문에, 목적에 따라 적절히 사용하는게 좋을 것 같습니다.

관련해서 다양한 의견 댓글로 달아주시면 좋겠습니다~

3개의 좋아요

immutable 객체는 thread safe 하다는 장점이 있죠.

3개의 좋아요