C#에서 StringWriter와 StringReader는 메모리상의 문자열을 대상으로 입출력을 처리하는 클래스입니다. StringWriter는 TextWriter를 상속하고, StringReader는 TextReader를 상속합니다. 두 클래스를 함께 사용하면 파일이나 네트워크 스트림 없이도 문자열 데이터를 스트림처럼 자유롭게 읽고 쓸 수 있습니다.
StringWriter란?
StringWriter는 문자열 버퍼에 정보를 기록하기 위한 TextWriter 구현체입니다. 파일 시스템에 접근하지 않고 StringBuilder 내부에 텍스트를 작성할 때 유용하며, ToString() 메서드를 호출해 지금까지 작성한 내용을 즉시 확인할 수 있습니다.
아래 예제는 문자열을 한 글자씩 읽어 들인 뒤, 마침표(.)를 만날 때마다 줄바꿈을 추가하여 문단을 나누는 코드입니다.
using System;
using System.IO;
class Program {
static void Main() {
string text = "Hello World. This is C#. Nice to meet you.";
StringWriter sWriter = new StringWriter();
using (StringReader sReader = new StringReader(text)) {
while (true) {
int value = sReader.Read();
if (value == -1) break; // 문자열 끝에 도달하면 종료
char convertedChar = Convert.ToChar(value);
if (convertedChar == '.') {
sWriter.Write(".\n\n"); // 마침표 뒤에 줄바꿈 추가
} else {
sWriter.Write(convertedChar);
}
}
}
Console.WriteLine(sWriter.ToString());
}
}
StringReader란?
StringReader는 문자열을 순차적으로 읽기 위한 TextReader 구현체입니다. StringBuilder로 조립한 문자열을 마치 스트림처럼 다룰 수 있으며, Read(), ReadLine(), ReadToEndAsync() 같은 다양한 읽기 메서드를 제공합니다.
아래 예제는 StringBuilder에 여러 줄의 텍스트를 추가한 후, StringReader로 전체 내용을 비동기 방식으로 읽어 출력하는 코드입니다.
StringBuilder sbuilder = new StringBuilder();
// 문자열 추가
sbuilder.AppendLine("첫 번째 줄입니다.");
sbuilder.AppendLine("두 번째 줄입니다.");
sbuilder.AppendLine("세 번째 줄입니다.");
// 문자열 읽기
using (StringReader sReader = new StringReader(sbuilder.ToString())) {
string readString = await sReader.ReadToEndAsync();
Console.WriteLine(readString);
}
핵심 차이점 요약
| 구분 | StringWriter | StringReader |
|---|---|---|
| 상속 클래스 | TextWriter | TextReader |
| 역할 | 문자열 버퍼에 데이터 쓰기 | 문자열에서 데이터 읽기 |
| 주요 메서드 | Write(), WriteLine(), ToString() | Read(), ReadLine(), ReadToEndAsync() |
| 활용 사례 | 템플릿 생성, 로그 조립, XML 직렬화 | 텍스트 파싱, 줄 단위 처리, 비동기 읽기 |
정리
StringWriter는 쓰기(Write), StringReader는 읽기(Read) 전용 도구라고 기억하면 됩니다. 두 클래스는 모두 메모리 기반으로 동작하기 때문에 가볍고 빠르며, 임시 텍스트 처리나 단위 테스트에서 특히 유용하게 활용됩니다.