파파비의 블로그
C#) mutable, immutable Type 이란? // string과 StringBuilder의 차이는? 본문
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 |