본문 바로가기

공부/유니티

[Unity] string과 가비지 컬렉터

유니티는 가비지 컬렉터(GC: Garbage Collector)로 사용되지 않는 객체를 정리해준다.

여기서 사용되지 않는 객체는 "참조"되지 않는 메모리 공간으로, 이 메모리 공간을 해제합니다.

메모리 공간을 해제하는 과정에서 성능이 저하되며, 게임이 느려질 수 있다.


string과 GC의 관계

string은 값 타입인 int, float 들과는 달리 참조 타입이라 GC의 대상이 된다.

왜 굳이 string을 참조 타입으로 만들었을까?

가장 중요한 이유는 string이 불변 객체이기 때문이다. 불변 객체는 값을 변경할 수 없는 객체이며,

데이터의 안전성과 예측가능한 동작을 제공하며, 보안 및 다중 스레드 환경에서의 안전성을 증가시키는 등의 이점이 있다.

 

그러면 string은 값을 바꿀 수 없을까? 다들 알고 있듯이 string은 다음과 같이 편하게 값을 바꿀 수 있다.

string text = "Hello";
text = "World";

어떻게 값이 변할 수 있었던걸까?

우선 string은 참조타입이기 때문에 힙 메모리에 값이 저장되고,

스택 메모리에서 힙 메모리의 주소를 참조한다.

Hello를 World로 바꿔주면 힙 메모리에 새로운 메모리 공간이 생성되고

스택 메모리에서 새로운 힙 메모리의 주소를 참조하게 된다.

 

여기서 GC와의 문제가 발생하게 되는데,

힙 메모리의 0x0012F450 메모리 공간은 아무런 참조를 받지 못하게 된다.

이렇게 참조를 받지 못하는 메모리 공간은 스택의 값과 다르게 바로 사용되지 않고, 일시적으로 메모리에 남게 된다.

남아있는 메모리들은 GC에 의해 공간 할당이 해제되게 되는 것이다.


해결 방법

string 변수의 값을 자주 바꿔줄수록 GC가 많은 공간을 할당 해제하며 성능에 큰 문제를 끼치게 된다.

당연하게도 이를 해결할 수 있는 방법이 있는데, StringBuilder를 사용하여 해결할 수 있다.

 

StringBuilder는 가변 객체로, 문자열을 합치거나 변경할 때마다 새로운 메모리 공간을 생성하는 것이 아니라 내부적으로 버퍼에 문자열을 저장하여 조작한다.

 

사용방법으로는 StringBuilder 객체를 생성하고, 각 메서드들을 사용하여 수정하면 된다.

 

메서드 종류

Append 새로운 문자열을 문자열 끝에 삽입
Insert 새로운 문자열을 특정 위치에 삽입
Replace 특정 문자열을 다른 문자열로 대체
Remove 특정 범위의 문자열을 제거
Clear 문자열을 모두 제거
Length 현재 문자열의 길이
ToString StringBuilder의 내용을 문자열로 변환

StringBuilder를 사용한 스탯 툴팁 구현

 

 

'공부 > 유니티' 카테고리의 다른 글

[Unity] 튜플(Tuple)  (0) 2024.01.29
[Unity] Assembly와 Namespace  (0) 2024.01.28
[Unity] Generic Collection  (0) 2024.01.28
[Unity] 제네릭(Generic)  (0) 2024.01.27
[Unity] UI 자동화  (0) 2024.01.27