[C#] StringBuilder

Learning 

When: 1학년 8월 12일

 

How:

가비지 컬렉터에 대해 배우다가 string 값을 계속 바꾸면 쓰레기 객체가 많이 생겨서 가비지 컬렉터가
청소할 때 시간을 더 많이 쓰게 된다는 것을 알아서 그것을 해결하는 법을 공부하다가
StringBuilder를 사용하면 된다는 것을 알고 그것에 대해 공부하게 되었습니다.

 

Understanding:

  • 정의 : StringBuilder에 대해 알기 위해선 먼저 가비지 컬렉터와 string 값에 대한 관계를 알아야 하는데, 
    string 값은 값 형식이 아니라 참조 형식이며, 불변 객체입니다. 값이 변하지 않는다는 뜻이죠. 하지만
    우리는 string 값을 바꿀 수 있는데, 아래의 코드처럼 string 값에 다른 값을 대입하거나 
    string 값에 + 연산자를 사용하여 또 다른 문자열을 추가할 수 있습니다. 하지만 이런 연산은 
    string 객체를 바꾸는 것이 아닌 새로운 string 객체를 만드는 행동이고, 원래 있던 객체는 
    쓰레기 객체가 됩니다. 이 모든 것은 string이 불변 객체이기 때문에 발생하는 일입니다. 그래서 C#
    개발자들은 이것을 해결하기 위해 StringBuilder라는 것을 만들었습니다. 이 클래스를 사용하면 
    쓰레기 객체가 만들어지는 것을 최소화할 수 있습니다. StringBuilder는 문자열을 바꿀 때 새로운
    문자열을 생성하지 않고, 더한 문자열을 만들기 때문에 문자열에 문자열을 더하거나 일정한 부분을
    빼거나 해도 새로운 문자열이 생기지 않습니다. 이렇게 되는 이유는 문자열을 바꿔도 실제 string 값을
    바꾸는 것이 아닌 클래스의 인스턴스 내에 있는 값을 바꾼 후, ToString() 메서드로 string 값으로 만들기
    때문이죠.
  • 쓰는 이유 : 아래의 코드는 코드로 문자열을 좀 바꿨다가 돌려놓은 것뿐으로 보이지만,
    내부적으로는 처음에 만든 "Hello World!" 문자열 객체가 쓰레기 객체가 되고, 새로 만든 "Hello" 객체,
    또 새로 만든 " World!" 객체까지 쓰레기 객체가 됩니다. 지금 쓰고 있는
    새로 만든 "Hello World!" 객체 말고는 다 쓰레기 객체가 되어버리는 것이죠. 
    string str = "Hello World!"; //"Hello World!" 문자열 객체 생성
    str = "Hello"; //"Hello" 문자열 객체 생성, "Hello World!" 객체가 GC의 정리 대상이 됨.
    str += " World!"; 
    	//" World!" 문자열 객체 생성, 복합 대입 연산자로 인해 "Hello World!" 객체 생성, 
        //"Hello" 문자열 객체와 " World!" 문자열 객체는 GC의 정리 대상이 됨.
    
    Console.WriteLine(str); //Hello World! 출력


  • 사용 방법 : 아래의 코드는 추가 점수를 인수로 넣으면 추가 점수가 반영된 점수를 반환하는 코드입니다.
    여기서 새로운 문자열 객체가 생성되는 시점은 반환할 때 StringBuilder를 문자열 형식으로
    바꾸기 위해 ToString() 메서드를 사용할 때 뿐입니다.
    아래의 코드를 보면 StringBuilder를 사용하기 위해서는 StringBuilder 클래스의 인스턴스를
    생성한 후, 그 인스턴스에 Append(문자열) 메서드를 사용하여 문자열을 추가하고, 마지막에 
    사용할 때 ToString() 메서드를 사용하여 string으로 바꿔주면 StringBuilder를 사용할 수 있다는 
    것을 알 수 있습니다. Append 문자열 외에도 Remove, Replace 등의 메서드도 있고, 
    이런 문자열을 써도 새로운 문자열 객체가 만들어지지 않습니다. 하지만 이런 문자열이 너무 커지면
    문자열을 담을 공간이 부족하여 공간을 키우는데, 이 공간을 키우는 행동에 비용이 꽤 들기 때문에
    이것도 유의하며 사용하는 것이 좋을 것 같습니다.
static StringBuilder builder = new StringBuilder();
static int currentPoint;
static void Main(string[] args)
{
    currentPoint = 0;
    Console.WriteLine(ReturnPoint(10));
}

static string ReturnPoint(int plusPoint)
{
	builder.Clear(); //문자열 비우기
    currentPoint += plusPoint;

    return builder.Append("현재 점수 :").Append(currentPoint).ToString();
}

 

Result: 문자열을 계속 바꾸면 쓰레기 객체가 많이 생성되어 GC가 처리해야 할 일이 늘어나기 때문에 문자열을 많이 바꿀 때는 StringBuilder를 사용하면 좋습니다. 그리고 ToString은 string을 만드는 메서드인 만큼 최소한 적게 사용해야 합니다.

'C#' 카테고리의 다른 글

[C#] where 키워드 (Generic 제한)  (0) 2025.08.20
[C#] Notify Value  (0) 2025.08.19
[C#] 가비지 컬렉터 (GC)  (4) 2025.08.11
[C#] 2차원 배열  (3) 2025.08.10
[C#] SOLID 원칙 (5 : D/DIP)  (2) 2025.08.10