[c#] 뮤터블과 이뮤터블의 객체 상태 변이 처리

C# 프로그래밍에서는 각각 뮤터블(mutable)과 이뮤터블(immutable) 객체를 다루는 방법에 대한 이해가 중요합니다. 뮤터블 객체는 변경 가능한 객체로, 내부 상태를 변경할 수 있습니다. 이뮤터블 객체는 변경 불가능한 객체로, 한 번 생성된 후에는 내부 상태를 변경할 수 없습니다.

뮤터블(Mutable) 객체

뮤터블 객체를 다룰 때에는 객체의 내부 상태를 변경할 수 있기 때문에 주의가 필요합니다. 예를 들어, List<T>Dictionary<K,V> 등은 뮤터블 객체입니다. 따라서, 해당 객체들을 전달한 후에 호출자가 내부 상태를 변경할 수 있기 때문에 예기치 않은 결과를 초래할 수 있습니다.

List<int> mutableList = new List<int> { 1, 2, 3 };
mutableList.Add(4);

위의 예시에서 mutableList의 내부 상태가 변경되는 것을 확인할 수 있습니다. 이러한 특성을 고려하여 뮤터블 객체를 사용할 때에는 상태 변이에 주의하여야 합니다.

이뮤터블(Immutable) 객체

반면에, 이뮤터블 객체는 한 번 생성된 후에 내부 상태를 변경할 수 없기 때문에 안전하게 다룰 수 있습니다. 예를 들어, string이나 DateTime 같은 .NET의 기본 데이터 형식들은 이뮤터블 객체입니다.

string immutableString = "Hello";
immutableString = immutableString.ToUpper(); // 새로운 객체를 반환하므로 원본은 변경되지 않음

이뮤터블 객체는 내부 상태 변이가 불가능하기 때문에 여러 스레드에서 동시에 접근해도 안전합니다.

객체 상태 변이 처리

프로그램을 개발할 때, 뮤터블 객체의 내부 상태를 변이하는 것보다는 이뮤터블 객체를 활용하여 상태 변이를 최소화하는 것이 더욱 안전한 방법이 될 수 있습니다. 또한, 뮤터블 객체를 사용해야 하는 경우에는 상태 변이를 제어하기 위해 해당 객체를 보호해야 합니다.

다음은 뮤터블 객체를 더욱 안전하게 다루기 위한 방법을 보여주는 예시입니다.

public class SafeMutableObject
{
    private List<int> safeMutableList;
    
    public SafeMutableObject(List<int> list)
    {
        this.safeMutableList = new List<int>(list);
    }

    public IReadOnlyList<int> SafeList => safeMutableList.AsReadOnly();
}

위의 예시에서 SafeMutableObject 클래스는 내부적으로 List<int>를 가지고 있지만, 외부에서는 AsReadOnly()를 사용하여 읽기 전용 리스트로만 접근할 수 있도록 구현하였습니다.

이와 같이 뮤터블과 이뮤터블 객체를 올바르게 다루는 것은 C# 프로그래밍에서 안전하고 효율적인 코드를 작성하는 데에 중요한 요소입니다.

이와 관련된 참고 자료: