본문 바로가기

개발/C#

Immutable type: Shallow Copy한 복사개체에서 문자열 변수 값을 변경하였지만 원본개체에서는 변경되지 않은 이유는?

Immutable 사전 뜻은 "변경할 없는", "불변의"입니다.

Immutable type 말그대로 인스턴스 생성 멤버 데이터를 변경할 없는 타입을 말합니다.

처음 Immutable type 그닥 신경쓰지 않았습니다. 겪을일이 없었기 때문이죠.

그러나 부제에서와 같이 Shallow Copy 유가 있어 하다보니 문득 의문이 들었습니다. " 복사개체에서 문자열 변수 값을 변경하였는데 원본개체의 문자열 변수에는 변경사항이 없는가? 내가 알고 있는 지식으로는 문자열은 참조형식이기 때문에 Shallow Copy에서 복사개체의 문자열또한 원본개체가 바라보는 주소와 같을텐데.."라고 생각하였습니다.

 

그러나 테스트를 해보았고 기대와 다른 결과가 나오게 되었습니다.

아래는 테스트 소스입니다.(/unsafe 통하여 컴파일 하셔야 합니다.)

 

static unsafe void Main(string[] args)

{

var string1 = "1";

var string2 = string1;

 

// 같은 주소를 바라보고 있다.

fixed (char* p = string1) { Console.WriteLine((int)p); }

fixed (char* p = string2) { Console.WriteLine((int)p); }

 

// string2 문자열을 변경하면 새롭게 할당하여 다른 주소를 갖게된다.

string2 = "2";

fixed (char* p = string2) { Console.WriteLine((int)p); }

fixed (char* p = string1) { Console.WriteLine((int)p); }

}

 

문자열은 Immutable type이기 때문에 값을 수정할 때마다 새로운 개체를 만들게 된다고 합니다.

계속 수정하는 경우 기존의 참조되지 않는 개체의 수가 증가(가비지 데이터)되고 성능까지 미친다고 합니다. 그래서 자주 변경되는 문자열인경우는 StringBuilder 사용하도록 추천을 해주었던 이유였습니다. 그래야 개체를 매번 만들지 않아 성능이 저하되는일이 없기때문입니다.

저는 StringBuilder 사용해야 한다고는 알고 있었으나 Immutable 대한 개념은 전혀 없었습니다. 그냥 아무런 이해없이 외우기만 하였다라는걸 이제서야 알게되습니다.

 

저와 같이 문자열은 참조형식이라는건 알지만 Immutable type 대한 개념이 없거나 간과하시는 분은 참고하시기 바랍니다.

 

Immutable Type Mutable Type

참고사이트

https://code.i-harness.com/ko/q/241758

http://guslabview.tistory.com/187

http://www.csharpstudy.com/CSharp/CSharp-string.aspx