스트림 조작자(Stream Manipulator)는 스트림 객체에서 삽입 연산자(<<)와 추출 연산자(>>)와 함께 사용하도록 특별히 설계된 함수입니다.
std::cout << std::setw(10);조작자 역시 일반적인 함수이므로, 스트림 객체를 인수로 전달하여 다른 함수처럼 직접 호출할 수도 있습니다.
boolalpha(cout);조작자는 주로 스트림의 서식(formatting) 설정을 변경하거나, 줄바꿈 같은 특수 문자를 삽입·추출할 때 사용됩니다. 대표적인 C++ 조작자들을 하나씩 살펴보겠습니다.
1. endl — 줄바꿈과 버퍼 플러시
endl은 줄바꿈 문자('\n')와 동일하게 개행 기능을 수행하지만, 한 가지 중요한 차이점이 있습니다. 바로 출력 스트림의 버퍼까지 강제로 비워주는(flush) 역할을 한다는 점입니다. 따라서 즉시 화면에 출력해야 하는 상황에서 유용하지만, 성능이 중요한 반복문 안에서는 '\n'을 사용하는 것이 더 효율적일 수 있습니다.
예제 코드
#include<iostream>
int main() {
std::cout << "Hello" << std::endl << "World!";
}실행 결과
Hello
World!2. showpoint / noshowpoint — 소수점 표시 여부 제어
showpoint와 noshowpoint는 부동소수점 숫자를 출력할 때 소수점을 항상 표시할지 여부를 결정합니다. showpoint를 적용하면 정수처럼 보이는 값(예: 1.0)도 소수점 이하 자릿수가 함께 출력되고, noshowpoint를 적용하면 불필요한 소수점이 생략됩니다.
예제 코드
#include <iostream>
int main() {
std::cout << "1.0 with showpoint: " << std::showpoint << 1.0 << '\n'
<< "1.0 with noshowpoint: " << std::noshowpoint << 1.0 << '\n';
}실행 결과
1.0 with showpoint: 1.00000
1.0 with noshowpoint: 13. setprecision — 부동소수점 정밀도 설정
setprecision은 부동소수점 숫자의 출력 정밀도를 변경합니다. out << setprecision(n) 또는 in >> setprecision(n) 형태로 사용하면 해당 스트림의 정밀도(precision) 매개변수가 정확히 n으로 설정됩니다. C++에서 기본 정밀도는 6자리이며, 이 값을 늘리면 더 많은 유효숫자를 출력할 수 있습니다. 참고로 setprecision을 사용하려면 <iomanip> 헤더를 포함해야 합니다.
예제 코드
#include <iostream>
#include <iomanip>
int main() {
const long double pi = 3.141592653589793239;
std::cout << "default precision (6): " << pi << '\n'
<< "std::setprecision(10): " << std::setprecision(10) << pi << '\n';
}실행 결과
default precision (6): 3.14159
std::setprecision(10): 3.1415926544. setw — 출력 필드 너비 설정
setw(set width)는 다음 입출력 필드의 최소 너비를 지정합니다. out << setw(n) 또는 in >> setw(n) 형태로 사용하며, 출력되는 값이 n자리보다 짧으면 앞쪽에 공백이 채워져 오른쪽 정렬된 형태로 출력됩니다.
특히 주의할 점은 setw는 바로 다음 하나의 출력에만 적용된다는 것입니다. 그다음 출력부터는 너비 설정이 해제되므로, 여러 값을 정렬해서 출력하려면 각 값마다 setw를 반복해서 지정해야 합니다.
예제 코드
#include <iostream>
#include <iomanip>
int main() {
std::cout << "no setw:" << 42 << '\n'
<< "setw(6):" << std::setw(6) << 42 << '\n'
<< "setw(6), several elements: " << 89 << std::setw(6) << 12 << 34 << '\n';
}실행 결과
no setw:42
setw(6): 42
setw(6), several elements: 89 1234위 실행 결과에서 마지막 줄을 보면, 12에는 setw(6)이 적용되어 공백이 채워졌지만 그 뒤의 34에는 적용되지 않아 붙여서 출력된 것을 확인할 수 있습니다. 이처럼 각 조작자의 동작 방식과 적용 범위를 정확히 이해하고 사용하면, 깔끔하게 정렬된 콘솔 출력을 손쉽게 만들 수 있습니다.