Game Development, 게임개발/개발

String과 StringBuilder의 차이, 용도 [Unity]

게임이 더 좋아 2022. 2. 27. 00:12
반응형
728x170

 

우리는 문자열이라면 무심코 String을 쓴다.

그게 잘못되었다는 말이 아니다.

다만 게임이라는 볼륨이 큰 작업에 있어서는 최적화 작업 중 하나가 될 수 있다는 것이다.

 

??? 어떻게 하는데???

 

알아보자

 


 

우선 string 클래스가 있어서 우리는 문자열을 쓸 수 있다는 것을 안다.

하지만 StringBuilder 클래스도 있는데.. 왜 이것이 최적화가 된다는 말인가???

-> 물론 모든 곳에서 쓰이는 곳이 아니다.

-> 프로그래밍에서 무조건 좋은 방법이란 없다. Trade-off 라는 것을 명심하자.

 

 

예를 들어보자.

캐릭터가 살고 있는 주소를 표현한다고 하자.

 

//용산역에 살고 있다면..?
string myAddress = "서울시" + "용산구" + "뭔동";

 

아무튼.. 저기서 문자열이 합쳐질 때 

우리는 그냥 값이 합쳐진다고 생각한다.

만들어진 객체는 myAddress 하나 다시 말해서 string 객체 하나라고 생각한다.

하지만 그것은 틀렸다.

 

"서울시" 에서 하나(1)

"용산구" 에서 하나(2)

"뭔동" 에서 하나 (3)

 

결국 3개가 생긴다.

(1) + (2) -> 합쳐진 (1)

합쳐진 (1) + (3) -> 다 합쳐진 (1)

 

그게 합쳐진 것이 myAddress가 가리킬 것이다.

 

그럼 뒤에 생긴 객체, 인스턴스 (2), (3) 은 만들어져 있다.

 

근데 뒤에서 쓰일까..? 저렇게 가리키는 아무 참조변수도 없는데..?

그렇지 않다.

그냥 저 때 1회용만 쓰일 거면서 GC에서 참조가 없으니 처리될 때까지 메모리에 남아있게 된다.

 

우리가 흔히 쓰는 문자열, String 클래스라는 말에서 알듯이

string은 값(Value)을 가지는 것이 아니라 참조변수(Ref)를 가지고 있다.

우리가 흔히 쓰는 "abc" 라는 것은 값이 아니라 객체, 인스턴스라는 것이다.

 

아래 글을 읽어보자

 

 

 

?? 뭐야 그러면 + 쓰지 말라는 거야 뭐야????

 

이렇게 편한 것을 왜 안써???

 

GC가 관리해준다며?? 굳이 내가 왜 신경써야 하는데?????

 

GC가 관리해주므로 평소에는 솔직히 string 써도 무리 없다.

저 위의 주의사항처럼 문자열을 수정할 때 "참조변수"만 잘 관리해도 된다.

 

다만 우리가 신경써야할 때가 있다.

집중해봐라

 

우리는 이따금씩 글자가 하나씩 출력되어보이는 애니메이션을 만들 때가 있다.

 

예를 들어 퀘스트창이 보이면 말하는 듯이 

한글자씩 써져서 보이지.. 한 번에 보이진 않는다.

 

영원한 나의 첫 RPG 메이플스토리

 

말을 걸자마자 처음부터 다 보인다고 생각해보자

 

말하는 느낌이 드나???

전혀 아니다.

 

그래서 우리는 때로 text를 만드는 것이 저 NPC가 만드는 것으로 착각하게 하는 애니메이션 효과를 준다.

 

바로 글자 하나씩 출력이다.

 

그게 뭐냐고??

 

예를 들어보자

 

string quest = "후우... 한 녀석은 가출에, 다른 녀석은 집 안에서 꼼짝도 안하고 밤낮으로 책만 읽어대고.. 내가 요즘 걱정이 많다네...\n"
             + "다행히 무사하다는 소식은 들었다네. 반성하고 돌아올 때까지 절대 먼저 찾지 않기로 결심했네! 아주 버릇을 고쳐놔야겠어. \n"
             ;

 

**저기 이상하게 한줄이 비어있는데.. 아마 \n을 저렇게 넣었을 것이고

**텍스트 박스가 overflow되면 알아서 vertical하게 넘어가는 것을 이용했을 것이다.

 

 

아무튼 이것이 하나씩 나오게 하려면 어떻게 해야할까?

 

for(int i = 0; i<quest.length; i++){
	view.text = quest.substr(0,i);
    //글자당 딜레이를 줘야지? 코루틴이든 유니태스크든
}

 

이렇게 하면 for문이 돌아갈 때마다 하나씩 보인다.

 

**오?? 좋은거 하나 배워갑니다~ 라고 하면 이 글을 쓴 보람이 생길 것이다.

**댓글로 응원 좀 부탁한다.

 

 

아무튼 위에서 말했다시피 string 객체 자체는 immutable이다. 

변경불가능하기 때문에 저렇게 substring을 만드는 것자체도

 

인스턴스를 만드는 행동인데 저걸 length 만큼 반복한다고??

만약 1000글자면??? 

 

1000개 객체가 생긴다고?? 그것도

char 에서 영어.. 1바이트... 한글 2바이트라치면..

2,4,6,8,10....2000???? 근데 그것의 합? 2002 * 500 ??? 

머리가 어질어질하다.

 

그래서 우리는 이런 거지같은 상황을 피하기 위해서 StringBuilder를 쓴다.

 

저 위의 코드를 StringBuilder로 바꾸면 어떻게 보일까??

 

var sb = new StringBuilder(); //먼저 만들어준다. -> 변경가능한 문자열이다.

for(int i = 0; i<quest.length; i++){
    sb.Append(quest[i]);
    view.text = sb;
}

 

이런 식이 될 것이다.

즉, 뒤에 추가적으로 Append를 붙여서 변경가능한 객체를 해서 참조 똑같이 하면 된다.

 

 

정리하자면!!!!

-> StringBuilder는 문자열 변경이 잦을때 사용한다.

 


참고 링크

https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/strings/

 

 

반응형
그리드형