본문 바로가기
C#

[C#] Immutable과 Mutable 타입

by ifhead 2022. 9. 10.
반응형

 

 

Immutable과 Mutable

프로그래밍에서 mutable과 immutable은 객체의 상태와 변수를 할당하고 변경할 수 있는 방법을 나타냅니다.

오늘날 대부분의 애플리케이션은 동적입니다. 그러니 데이터가 어떻게 변경되는지가 중요합니다.

  • Mutable과 immutable은 각각 "변경할 수 있는"과 "변경할 수 없는"을 의미합니다. 
  • 변경 가능한 타입은 인스턴스가 생성된 후 데이터 멤버를 변경할 수 있는 타입입니다.
  • 변경 불가능한 타입은 인스턴스가 생성된 후에 데이터 멤버를 변경할 수 없는 타입입니다.

 

Immutable Type : 변경할 수 없는 타입

  • 개체를 생성하고 변경하지 않아야 프로그래밍의 부작용을 줄일 수 있을 때 사용합니다.
  • 변경 불가능한 오브젝트의 값을 바꿀 때는 새로운 메모리가 생성되고 수정된 값이 새로운 메모리에 저장됩니다.
  • 문자열은 변경할 수 없습니다. 즉, 기존 메모리 공간(Heap)에서 작업하는 대신 매번 새 메모리 공간을 생성합니다.
  • 여러 개의 스레드가 같은 객체를 참고할 수 있으므로 Thread-Safe 합니다.
  • 객체에 수정이 없는 한 메모리 사용이 적습니다.
기존 문자열의 값을 수정할 때마다, 수정된 문자열을 참조하는 새 객체를 생성하고 이전 문자열은 참조되지 않게 됩니다. 
따라서 기존 문자열을 계속 수정하는 경우 참조되지 않은 개체의 수가 증가하고 가비지 수집기가 참조되지 않은 개체를 해제할 때까지 기다리므로 애플리케이션 성능이 저하됩니다.

 

변경 불가능한 클래스 예시

class MyClass
{
    private readonly string myStr;

    public MyClass(string str)
    {
        myStr = str;
    }

    public string GetStr
    {
        get { return myStr; }
    }
}

 

Mutable Type : 변경할 수 있는 타입

  • 변경 가능한 오브젝트의 값을 변경하면 동일한 메모리에서 값이 변경됩니다. 
StringBuilder는 변경 가능한 유형입니다. 즉, 동일한 메모리 위치를 사용하고 하나의 인스턴스에 항목을 계속 추가/수정합니다. 
더 이상 인스턴스를 생성하지 않으므로 애플리케이션의 성능이 저하되지 않습니다.
  • List, ArrayList, HashMap 등이 Mutable 타입에 속합니다.

 

반응형

댓글