무효 클릭 IP 추적 중...
c#

[c#] 값 형식 처럼 작동하는 string(참조 형식)

꼬예 2022. 5. 17.

string 타입은 참조형식(reference types)의 데이터 타입입니다. 

해당 포스팅에서 설명 드렸듯이 실제 데이터 값은 힙(heap)메모리에 저장이 되고, 스택(stack)메모리에는 힙 메모리의 주소가 저장이 되는 형태 입니다. 

 

그런데 특이하게도 이 string 타입은 다른 참조형식과는 조금 다른 방식으로 활동을 하는 것처럼 보입니다.

 

 

string 코드 예제

"안녕"이라는 데이터값을 Text라는 변수에 넣고, Text를 다시 Text2에 할당을 한 뒤, 최종적으로 Text2의 값을 변경한 코드입니다.

(이전 포스팅에서 지겹게 다룬 내용이기 때문에 자세한 설명은 생략합니다.)

 

output:

 

결과를 보시면 뭔가 이상한걸 느끼셨을겁니다. 

분명 이전에 참조 형식(reference types)의 경우 모든 변수들끼리 연결되어있기 때문에 같은 값이 나와야 하지 않냐라고 의문이 드실텐데요.

 

 

실제로 기존 참조 형식과 어떻게 다른지 아래 그림을 통해 자세히 알아보겠습니다.

 

string 타입 작동 방식(with 그림)

 

(1) text에 "안녕"이라는 데이터를 할당하고, text2변수에 text를 할당 한 상황입니다.

여기 까지는 기존에 우리가 알아보았던 참조형식과 똑같습니다. 

 

(2) 그런데 text2의 값을 "hello"로 변경할때 뭔가 다른 작동이 발생됩니다.

힙 메모리주소(0x053112)에 있던 기존값을 변경 하지 않고, 새로운 메모리공간(0x053252)를 만듭니다.

그리고 스택의 메모리주소새롭게 생성된 힙의 메모리주소를 가르키게 됩니다.

왜 이런 현상이 일어났을까요?

string은 참조형식이지만 동시에 immutable type , 즉 불변 객체이기 때문입니다.

다시 말해 값을 변경할 수 없습니다. 0x53112 메모리공간에서 데이터 값만 쏙 변경 할 수 없고, 변경하려면 위와 같이 새로운 메모리 공간(0x053252)를 만들어서 그 공간에 값을 넣어야 하는 거죠. 

 

그렇기 때문에 마치 결과값은 값형식처럼 작동하는것처럼 보이는 것입니다.

 

가비지 발생

더나아가서 text에 "하이"라는 데이터를 재 할당해보겠습니다.

그러면 앞서 알아 보았듯 새로운 메모리 공간(0x055122)을 만들고 해당 공간에 데이터가 들어가게 됩니다.

 

그런데 문제는 기존에 0x053122에 들어있는 데이터가 순식간에 아무한테도 주목받지 못하는, 즉 낙동강 오리알 신세가 되어버립니다.

 

힙(heap)에 저장된 값은 스택(stack)과 다르게 쓸모없다고 해서 바로 삭제되지 않고 일시적으로 메모리 남게 됩니다.

이렇게 남은 녀석들을 가비지라고 하는데요.

 

문제는 이러한 값 변경을 무수히 많이 하게 된다면, 메모리 효율성이 엄청 떨어지게 됩니다. 

이러한 문제는 어떻게 해결할까요?

 

이러한 문제를 해결하기 위한것이 StringBuilder입니다. 해당 내용은 해당 포스팅을 참조하시기 바랍니다. 

 

 

이 글과 읽으면 좋은글

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글