안녕하세요 C# 개발자 코드몽키입니다
제목처럼 mutable 과 immutable에 대한 질문입니다.
그전에 먼저 mutable과 immutable에 대한 정의를 해보자면
mutable: 객체 생성 후 해당 메모리의 값이 변할수 있는 객체
immutable: 객체 생성 후 해당 메모리의 값이 변경되지 않는 객체
쉽게 생각해서 객체 생성 후 값을 변경했을 때 동일한 메모리에 데이터값을 변경시키느냐
새로운 메모리에 값을 이동시키느냐 라고 이해를 했었습니다.
해당 내용을 확인하기 위하여 vs에서 메모리값을 확인하는 예제를 만들었습니다.
1. int가 가변인지 불변인지 확인하기 위한 코드
int i = 10;
int* ptri1 = &i;i = 20;
int* ptri2 = &i;
이름 | 값 | 형식 | |
---|---|---|---|
![]() |
ptri1 | 0x00000059dc39ea6c | int* |
![]() |
ptri2 | 0x00000059dc39ea6c | int* |
동일한 메모리에서 값 변화가 일어남
RESULT: 가변
2. List가 가변인지 불변인지 확인하기 위한 코드
List list = new List();
list.Add(0);
int list1 = list[0];
int* ptrList1 = &list1;list[0] = 5;
int list2 = list[0];
int* ptrList2 = &list2;
이름 | 값 | 형식 | |
---|---|---|---|
![]() |
ptrList1 | 0x00000059dc39ea4c | int* |
![]() |
ptrList2 | 0x00000059dc39ea3c | int* |
메모리 이동과 함께 값 변화가 일어남
RESULT: 불변
3. string, StringBuilder가 가변인지 불변인지 확인하기 위한 코드
string str = “test”;
char str1 = str[0];
char* ptrStr1 = &str1;str += “test”;
char str2 = str[0];
char* ptrStr2 = &str2;//////////////////////////////////////////
StringBuilder sb = new StringBuilder();
sb.Append(“test”);
char sb1 = sb[0];
char* ptrSb1 = &sb1;sb.Append(“test”);
char sb2 = sb[0];
char* ptrSb2 = &sb2;
이름 | 값 | 형식 | |
---|---|---|---|
![]() |
ptrStr1 | 0x00000059dc39ea24 | char* |
![]() |
ptrStr2 | 0x00000059dc39ea14 | char* |
![]() |
ptrSb1 | 0x00000059dc39e9fc | char* |
![]() |
ptrSb2 | 0x00000059dc39e9ec | char* |
메모리 이동과 함께 값 변화가 일어남
RESULT: 불변
최종결론
int는 동일한 메모리에서 값 변화가 나타나고
list, string, stringbuilder에서는 값 변경을 할 경우 메모리 위치가 변경됩니다.
질문을 올린 이유는
인터넷 블로그의 글을 보면
string - immutable
StringBuilder - mutable
이기 때문입니다.
그런데 제가 테스트 했을 때는 string과 StringBiulder가 동일하게 immutable로 보이기 때문에 질문드립니다.
제가 지금 예제를 잘못 만든 것인지 개념을 잘못 이해하고 있는 것인지 답변 부탁드리겠습니다.
위 내용 보시고 혹시 이해가 안되거나 이상한부분있으면 말씀해주십시요.
감사합니다!