C++에서 숫자를 출력할 때 자릿수를 맞추기 위해 앞에 0(선행 0, leading zero)을 붙여야 하는 경우가 종종 있습니다. 하지만 숫자 값 앞에 직접 0을 입력하면 컴파일러가 이를 모두 무시하고 실제 숫자만 출력하기 때문에 원하는 형태의 결과를 얻을 수 없습니다.
setw()와 setfill()의 기본 개념
C 언어에서는 printf의 형식 지정자(format specifier) 옵션으로 이 문제를 해결할 수 있지만, C++에서는 iomanip 라이브러리를 사용해 출력 스트림을 훨씬 간편하게 조작할 수 있습니다. 이 라이브러리에서 자주 사용되는 두 가지 함수는 다음과 같습니다.
- setw(n) : 출력 필드의 너비를 n칸으로 지정합니다. 출력할 값이 n칸보다 짧으면 나머지 공간이 비어 있게 됩니다.
- setfill(ch) : setw()로 확보된 빈 공간을 지정한 문자로 채웁니다. 여기에 '0'을 지정하면 선행 0이 자동으로 채워집니다.
예제 코드
아래 코드는 숫자 256을 총 8자리로 출력하여 00000256 형태로 만드는 예제입니다.
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int number = 256; // 00000256처럼 총 8자리로 출력하고 싶은 경우
cout << setw(8) << setfill('0') << number;
return 0;
}
실행 결과
00000256
알아두면 좋은 추가 팁
1. setw()는 일회성입니다. setw()로 설정한 필드 너비는 바로 다음 출력 항목에 한 번만 적용되고 자동으로 초기화됩니다. 반면 setfill()은 스트림의 상태로 유지되므로, 필요 없어지면 setfill(' ')처럼 공백으로 되돌려 주는 것이 좋습니다.
2. 정렬 방향을 바꿀 수 있습니다. 기본적으로 출력은 오른쪽 정렬이지만, left 조작자를 사용하면 왼쪽 정렬로 변경할 수 있습니다.
cout << left << setw(8) << setfill('0') << number; // 25600000 출력3. C 스타일 출력도 가능합니다. printf를 선호한다면 printf("%08d", number);와 같이 형식 지정자로 동일한 결과를 얻을 수 있습니다.
이처럼 iomanip 라이브러리의 setw()와 setfill()을 조합하면 날짜, 시간, ID 번호 등 고정 자릿수가 필요한 다양한 출력 상황에서 손쉽게 선행 0을 처리할 수 있습니다.