삽질의 현장/- .NET

#012_닷넷(.NET)_.Net Framework 기본 - 문자열(2) & 가비지 컬렉터

shovelman 2015. 10. 23. 00:50


안녕하세요 삽잡이입니다.

이번 시간에는 문자열에 대해서 조금 더 알아보는 시간을 가져보려고합니다.


문자열에서 주의해야할 점은 바로 불변성입니다.


문자열에 기본적인 연산자는 사실 중복정의 되있습니다.

즉, 대괄호 중복 정의가 이미 되있다는 것입니다.


하지만,C#에서는 읽기만 가능하고 쓰기는 불가능합니다.



원본 문자열은 바뀌지 않습니다. 절대로 말입니다...

문자열을 변환하는 함수를 통해 변환이 가능하긴 합니다...


그런데 변환을 한다고 원본이 변환이 되는 것이 아닙니다.

변환이 된 복사본이 생성될 뿐이지요...

만약 원본을 바꾸고 싶다면 변환한 복사본을 다시 넣는 방법이 있습니다.


닷넷은 메모리 영역을 딱! 두 가지로 봅니다.

바로 Stack과 Heap입니다.


참조자는 모두 stack 영역에 만들어집니다.

그리고 이 참조자는 객체를 가리키지요...

해당 예제에서는 문자열을 가리키고 있는 것입니다.

이놈은 string 객체입니다. 참조자인 참조변수는 string 참조자이구요...



만약 문자를 ToUpper() 메서드와 같이 문자열을 변환 시키면

사실, 복사본이 만들어지고 이 복사본... 즉, 변환된 객체가 생성되어

이 복사본을 참조자가 가리키게 하는 것입니다.

그리고 원래 객체는 가비지 컬렉션이 됬을 때 사라집니다...


C#과 Java에서는 delete라는 소멸 키워드가 없습니다.

즉, '객체를 할당하고 잊어버리자!' 하는 특징을 가지고 있지요...


가비지 컬렉션이 동작하면 비결정적이기 때문에

언젠간 날아가게 되있습니다... 참조가 없어지면 말입니다...


참고로,

스택 참조 뿐만 아니라 시스템 내부적으로, 레지스터 내부적으로

참조하는 루트가 존재하지 않는다면 가비지 컬렉션 대상이 됩니다.


만약 참조자를 더 이상 쓸 필요가 없게 된다면

참조변수에 null을 대입 시켜주면 됩니다.

그러면 이 참조자는 아무것도 가리키지 않는 상태가 되어서 가비지 컬렉션 대상이 됩니다.


가비지 컬렉터는 사실 '쓰리게 수집'을 담당하는 녀석입니다.

즉, 사용하지 않는 메모리를 수거하는 놈입니다.


그런데 네트워크 상황과 같이 많은 데이터들이 들어오며 

계속해서 복사본들이 생기게 된다면 메모리가 많이 채워지고

가비지 컬렉터는 동작하고 난리가 날 수 있습니다...

결국 성능을 저하시킬 수 있는 위험이 초래할 수 있다는 것입니다.

이 때에는 StringBuilder를 사용하면 됩니다.


즉, 원본이 변경되지 않는 것이 아니라

원본을 변경시켜 추가할 수 있는 기능을 제공하는 것입니다.