C# 프로그래밍 기초 실습 전자책

C# / .NET 알고리즘과 퀴즈
본 알고리즘 퀴즈 문제는 C#/.NET 개발자를 위한 알고리즘 인터뷰 혹은 C# 프로그래밍을 통한
문제 해결 알고리즘을 연구해 보는데 도움이 되고자 작성되었습니다.


퀴즈 질문


예상답변/설명

String은 Immutable 즉 한번 문자열을 지정하고 객체를 생성했으면, 더이상 문자열을 수정할 수 없게 된다. Mutable 타입인 StringBuilder는 이와 반대의 경우로 객체 생성이후에도 문자열을 수정할 수 있다.

예를 들어, 아래의 코드는 1부터 10000까지 숫자를 string 변수에 연속해서 추가하는 예이다.

string s = string.Empty;
for(int i=1; i<=10000; i++)
{
	s += i.ToString(); 
}

이 코드의 문제점은 string변수 s에 숫자를 추가할 때, 해당 변수 s의 값을 수정하는 것이 아니라 별도의 새 string객체를 만들고(물론 이름은 s로 똑같지만 Heap상의 메모리는 다르다) 이전 s의 문자값을 새로운 문자열 객체에 복사하게 된다는 점이다. 이러한 새 객체 생성및 기존 데이타 복사가 루프에서 만번 일어 나기 때문에 성능은 저하되고 필요 이상의 많은 메모리를 쓰게 된다.

이러한 문제점을 막기 위해 string 대신 StringBuilder를 사용한다. StringBuilder는 새로운 객체를 생성하지 않고 자신의 내부 버퍼 값만 변경함으로써 값을 추가하게 된다. 따라서 불필요한 객체 생성과 매번 일어나는 데이타 복사 과정이 없어지게 된다. (주: StringBuilder도 해당 객체의 버퍼 용량(Capacity)을 넘는 데이타가 들어올 경우 새로운 버퍼를 현재 Capacity의 2개 크기로 재할당하고 기존 데이타를 복사하게 된다.)

StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 10000; i++)
{
	sb.Append(i);
}
string s = sb.ToString();