C++에서 stringstream(문자열 스트림)은 문자열 객체를 스트림과 연결해 주는 클래스입니다. 이를 활용하면 마치 cin으로 입력을 읽듯이 문자열로부터 데이터를 자유롭게 읽고 쓸 수 있습니다.
문자열을 직접 파싱하는 것보다 훨씬 직관적이고 안전하기 때문에, 단어 분리, 형식 변환 등 다양한 작업에 널리 사용됩니다.
stringstream의 주요 메서드
stringstream 클래스는 다음과 같은 핵심 메서드와 연산자를 제공합니다.
- clear(): 스트림의 오류 상태 플래그를 초기화하여 스트림을 재사용할 수 있게 합니다.
- str(): 스트림 내부에 담긴 문자열 객체를 가져오거나(get), 새로 설정(set)합니다.
- operator << : 문자열이나 숫자 등의 데이터를 stringstream에 추가합니다.
- operator >> : stringstream 객체로부터 데이터를 읽어옵니다.
예제 1: 문장을 단어별로 분리하기
첫 번째 예제는 stringstream을 사용해 하나의 문장을 공백 기준으로 단어별로 나누어 벡터(vector)에 저장하는 프로그램입니다.
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main() {
string str("Hello from the dark side");
string tmp; // 반복마다 단어를 저장할 문자열
stringstream str_strm(str);
vector<string> words; // 단어를 담을 벡터 생성
while (str_strm >> tmp) {
// 여기서 tmp가 비어 있는지 검사하거나
// !, ., ? 같은 특수문자를 제거하는 처리를 추가할 수 있습니다.
words.push_back(tmp);
}
for(int i = 0; i < words.size(); i++)
cout << words[i] << endl;
}실행 결과
Hello from the dark side
>> 연산자는 공백을 만날 때마다 자동으로 구분해 주기 때문에, 별도의 복잡한 파싱 로직 없이도 손쉽게 단어를 추출할 수 있습니다.
예제 2: 10진수를 16진수로 변환하기
두 번째 예제는 stringstream과 hex 조작자(manipulator)를 조합하여 10진수를 16진수 문자열로 변환하는 방법을 보여줍니다.
#include<iostream>
#include<sstream>
using namespace std;
int main(){
int decimal = 61;
stringstream my_ss;
my_ss << hex << decimal; // 10진수를 16진수로 변환하여 삽입
string res = my_ss.str(); // 결과 문자열 추출
cout << "61의 16진수 값: " << res;
}실행 결과
61의 16진수 값: 3d
정리
이처럼 stringstream은 문자열 파싱과 수치 변환 모두에 유용하게 활용됩니다. <<와 >> 연산자 덕분에 코드가 간결하고 가독성이 높아지며, atoi, sprintf 같은 C 스타일 함수보다 타입 안전성 측면에서도 우수합니다. 문자열 기반 데이터 처리가 필요하다면 stringstream 사용을 적극 권장합니다.