모름

원본 링크 : https://hongjinhyeon.tistory.com/91

 

준 단계별 문제를 푸는 와중에 언어 빠른 입출력 방법에 대한 설명이 등장했다(!)

 

String으로 입력받고 출력만 했었는데 다른 방법이 또 있었나보다. 이렇게 다른 방법을 알려주는 것을 보면 또 모르고 지나칠수가 없기에 나름대로 정리를 해본다.

 

---

 

백준사이트 게시글에 나온 C#의 빠른 언어 입출력 방법은 아래와 같다.

 

StreamReader로 읽고, StringBuilder로 출력을 모아 놓았다가 그 String을 Console.WriteLine하는 방법이 있습니다. BufferedStream과 StringWriter로 조금 더 향상시킬 수 있는 것 같으나 자세한 것은 다른 분의 답변을 기다리겠습니다.

 

여기서 String만 이용했을 때와 어떤 점에서 더 빠르다는 것일까? 장단점은 무엇일까? 너무 깊게 파고들기는 어려워서 간단하게 String과 Stringbuilder를 사용하는 경우에 대해서 정리해본다.

 

 

--

 

문자열을 조합하는 경우가 많다. 본인은 조합하는 경우를 경험하지 못했지만 암튼 그렇다. 이렇게 문자열을 조합하는 방법에는 String을 쓰는 방법, Stringbuilder를 쓰는 방법으로 나뉜다.

 

문자열 조합에 String을 쓰는 방법

String은 Value타입이 아닌 Ref타입입니다. 즉, 문자열을 조합할때마다 새로운 Class가 생성되며 이전의 데이터는 GB(가비지 콜렉터)에 의해 수집됩니다. 따라서 문자열을 조합할때마다 부하가 발생하게 됩니다.

 

예를 들어 아래의 코드를 보자.

string name = "철수" + "영희" + "길동";
Console.WriteLine(name);

위 경우 총 3개의 String instance가 생성이 된다. 그리고 앞선 2개의 인스턴스는 GB에 의해 언젠가 수집될 운명입니다. 결국 메모리 낭비가 발생하며 비효율적인 코드가 생성됩니다.

 

 

Stringbuilder를 쓰는 방법

Stringbuilder를 사용하면 문자열을 조합할때마다 새로운 변수를 생성할 필요가 없습니다. Stringbuilder 내부 자체적으로 함수를 가지고 있어서 값들을 조합하고 삭제할때 인스턴스를 추가발생시키지 않습니다.

 

아래에 예를 보세요.

Stringbuilder names = new Stringbuilder();
names.Append("철수");
names.Append(" 영희");
names.Append(" 길동");

Console.WriteLine(names.ToString());

 

그렇다면 주의사항은?

string을 사용하는 경우

 - 문자열의 수가 적을 경우 (stringbuilder는 string에 비해 무시해도 좋을 정도의 성능향상을 보이거나 전혀 없을수가 있다)

 - 문자열을 작성하는 동안 광범위한 검색 작업이 예상될때 (왜냐하면 stringbuilder에는 IndexOf 또는 StartWith같은 함수가 없기 때문이다)

 

stringbuilder를 사용하는 경우

 - 응용 프로그램이 설계시에 알 수 없는 횟수의 문자열을 변경해야 할 때 (사용자의 입력등으로 문자열 조합이 이루어질 때)

 - 문자열에서 많은 횟수의 변경이 예상 될 때

 

PS 파일스트림 속성