가변(Mutable)과 불변(Immutable)
가변(Mutable)은 "변경할 수 있는"을 의미하며, 불변(Immutable)은 "변경할 수 없는"을 의미하는 단어입니다. 이 단어는 프로그래밍 언어에서도 동일한 의미를 가집니다. 변경 가능한 타입은 인스턴스가 생성된 후 값이 변경될 수 있지만, 변경 불가능한 타입은 인스턴스가 생성된 후 값을 변경할 수 없는 타입입니다.
C#에는 불변 클래스인 string과 가변 클래스인 StringBuilder가 존재하는데, 이번 포스팅에서는 string과 StringBuilder 클래스로 불변과 가변에 대해 설명합니다.
string
string은 변경할 수 없는 타입입니다. 문자열 변수는 스택(Stack)에 생성되며, 힙(Heap)에 생성되는 문자열 주소를 참조합니다. string 타입의 값을 변경하면 힙에 새로운 문자열이 생성되고 스택에 존재하는 문자열 변수는 힙에 생성된 새로운 문자열 주소를 참조합니다.
다음은 string 변수가 스택과 힙에 생성되는 과정을 설명합니다.
string str = "ABC";
str = "DEF";
순서 1. string str = "ABC";
string 타입의 변수를 생성하면, 스택에 메모리 공간이 할당됩니다. 스택에 할당된 문자열 변수 str
의 메모리 공간은 힙에 생성된 문자열 "ABC"의 주소 값 0x1000을 참조합니다.
순서 2. str = "DEF";
string 타입의 변수 str
의 값을 변경하면, 힙에 생성된 문자열 "ABC"가 "DEF"로 변경되는게 아니라 새로운 공간이 생성됩니다. 그리고 스택에 할당된 문자열 변수 str
의 메모리 공간은 문자열 "DEF"의 주소 값 0x2000을 참조합니다.
string 타입의 변수를 수정하면, 힙에 생성된 문자열 메모리 공간의 값을 변경하지 않으므로 string은 불변 클래스입니다. 힙에 생성되었지만 사용되지 않는 문자열 "ABC"의 메모리 공간은 가비지 컬렉션에 의해 소멸됩니다.
StringBuilder
StringBuilder는 변경할 수 있는 타입입니다. string과 마찬가지로 StringBuilder 객체는 스택에 생성되며, 문자열은 힙에 생성되지만, 값을 추가하거나 변경하는 과정은 string과 다릅니다. 문자열을 추가하거나 변경하는 경우 힙에 새로운 메모리 공간을 생성하지 않으며 기존 메모리 공간에 값을 변경합니다.
다음은 StringBuilder 객체가 스택과 힙에 생성되는 과정을 설명합니다.
StringBuilder str = new StringBuilder("ABC");
str.Replace("ABC", "DEF");
순서 1. StringBuilder str = new StringBuilder("ABC");
StringBuilder 타입의 객체를 생성하면, 스택에 메모리 공간이 할당됩니다. 스택에 할당된 StringBuilder 객체 str
의 메모리 공간은 힙에 생성된 문자열 "ABC"의 주소 값 0x1000을 참조합니다.
순서 2. str.Replace("ABC", "DEF");
StringBuilder 타입의 객체 str
에서 Replace()
함수를 사용하여 문자열 "ABC"를 "DEF"로 변경합니다. 값을 변경하면, string 타입과 달리 힙에 새로운 메모리 공간이 생성되지 않고 기존 메모리 공간에서 값이 변경됩니다.
가변 객체는 힙 영역에 새로운 메모리 공간을 생성하지 않아도 되므로 불변 객체보다 메모리 누수가 적은 편입니다.
'C#' 카테고리의 다른 글
[C#]StringBuilder 사용 방법 (1) | 2022.02.05 |
---|---|
[C#]List 특정 값 존재하는지 체크하는 방법 (1) | 2022.01.24 |
[C#]인덱서 사용 방법 (0) | 2022.01.17 |
[C#]열거형 사용 방법 (0) | 2022.01.17 |
[C#]Hashtable 사용 방법 (0) | 2022.01.12 |
댓글