파파비의 블로그

C#) mutable, immutable Type 이란? // string과 StringBuilder의 차이는? 본문

개발/c#

C#) mutable, immutable Type 이란? // string과 StringBuilder의 차이는?

N. Dave 2020. 4. 1. 12:00
반응형

c#에서는 타입을 분류하는 다양한 기준들이 있지만,

그 중에는 mutable과 immutable로도 나눌 수 있다.

 

이 둘의 나누는 기준은

 

"할당한 data를 변경 가능하냐?" 이다.

 

예를 들어보자면,

int는 mutable한 type인데.

int num = 3 으로 할당할 경우, 스택 메모리상에 할당된다 (int는 값형식이니까..)

스택 메모리 100번지에 할당 됐다고 가정해보자,

 

그 뒤에 num = 4; 로 값을 바꿀 경우,

동일한 메모리상에서 값이 변경 된다.

스택 메모리 100번지에 값은 3이 아니라 4가 되는 것이다.

 

반대로 string은 immutable 한 type이다.

string a = "hello"의 경우, 힙 메모리에 저장된다.(string은 레퍼런스 형식이기 때문이다)

힙 메모리 100번지에 hello가 할당됐다고 해보자.

 

그 뒤에 a = "pap" 으로 값을 바꿀 경우,

내부적으로는 "pap"이라는 값은 힙 메모리 어딘가 새로운 곳에 할당 된다.

100번지가 아닌 다른 곳에 말이다.

그리고 a라는 변수의 레퍼런스는 pap이 할당된 곳을 가르키게 된다.

 

힙 메모리 100번지의 값을 hello > pap으로 바꾸면 되지 않느냐!

라고 생각할 수 있다.

하지만 그럴 수 없다! 왜냐면 immutable한 type이기 때문이다

만약 string이 mutable 한 type이었더라면, 그렇게 했을 것이다.

 

(다른 언어에서는 string이 mutable일 수도 있다.)

 

참고로 위에 힙메모리, 스택메모리가 이해 안되더라도 

mutable과 immutable을 이해하는 데에는 지장이 없다.

 

 

 

 

mutable과 immutable은 어떤 의미를 갖고 있을까?

 

string에 또 다른 string을 추가하는 작업을 한다고 가정해보자

- ex) string s = "0";

s = s+"1";

 

그리고 그 작업을 매우 많은 회수한다고 가정해보자

s = s+"2"

s = s+"3"

s = s+"4"

...

그러면 매번 s에 새로운 값을 할당하기 위해 새로운 객체가 메모리에 할당된다.

만약 위 작업을 무수히 많이 할 경우 메모리 에러로 이어질 수 있다.

 

그렇다면 위의 방법을 메모리 무리 없이 잘 할 수 있는 방법은 무엇일까?

 

바로 StringBuilder를 사용하는 것이다. StringBuilder는 mutable type이기 때문이다.

그래서 객체를 1개로 위와 같은 추가 작업을 할 수 있다.

물론 내부적으로 StringBuilder의 객체가 커지면 메모리할당은 늘리겠지만

객체를 100만개까지 늘린 것 처럼 메모리를 사용하지는 않는다.

 

사용방법은

StringBuilder sb = new StringBuilder();

sb.Append()를 활용하여 파라미터에 추가하고 싶은 string을 넣으면 되고,

다 추가작업이 끝나면 sb.ToString()을 통해 string으로 변환하면 된다.

 

 

 

 

참고:

https://www.youtube.com/watch?v=-_BO84cIg3g&feature=youtu.be

 

 

 

 

반응형

'개발 > c#' 카테고리의 다른 글

C#) try, catch) 에러 핸들링  (0) 2020.04.02
C#) break와 continue  (0) 2020.04.02
C#) switch문 이해하기  (0) 2020.04.02
C#) 값형식과 레퍼런스형식  (0) 2020.04.01
C#) char[] 를 string 으로 바꾸기  (0) 2020.04.01
Comments