C++은 출력 형식을 사용자가 원하는대로 지정할 수 있는 Manipulator를 제공한다.
c++의 outstream인 std::cout과 << 연산자와 같이 사용되며 특정 수를 원하는 진법(base)으로 나타낼 수 있으며 0x와 같은 진법에 대한 구분 표시 유무, 대소문자 등을 조정할 수 있고 output과 추가 공백을 포함한 크기를 지정할 수도 있으며 공백을 다른 문자로도 채우기 등 여러 기능이 있다.
먼저 진법의 종류에 대해 알아보자.
지원하는 진법에는 10진수(decimal), 16진수(hexadecimal), 8진수(octal)가 있다. 2진수는 지원하지 않지만 bitset 클래스를 통해 사용가능하고 여기서는 다루지 않겠다.
10진법, 16진법, 8진법과 같이 어떤 수를 특정 진법으로 나타내기 위해선 다음과 같이 dec, hex, oct를 사용하며, 0x와 같은 특정 진법(base)의 표현 방법을 표시하기 위해선 std::showbase 함수를 사용한다.
int num = 52;
std::cout << std::dec << num << std::endl;
std::cout << std::hex << num << std::endl;
std::cout << std::oct << num << std::endl;
std::cout << std::showbase << std::showpos << std::endl;
std::cout << std::dec << num << std::endl;
std::cout << std::hex << num << std::endl;
std::cout << std::oct << num << std::endl;
dec, hex, oct와 같은 진법과 showbase, showpos는 한 번 출력 시만 유효한 동작이 아니다.
이 조정자는 출력 스트림인 cout에 저장되어 원래대로 바꿔주지 않는 한 동작들이 계속 유지가 된다.
result)
std::showbase는 16진수(0x), 8진수(0)를 보여준다(show)라는 의미이며 std::showpos는 십진수 양수일 경우 positive(+)를 표시한다는 의미이다. 이 옵션들은 std::cout이라는 outstream에 저장되며 std::noshowbase 또는 std::noshowpos를 사용하기 전까지 유지되는 옵션들이다.
다음은 대소문자 관련 조정자이다. std::uppercase, std::nouppercase는 16진수에 나오는 영문자를 대문자 또는 소문자로 지정할 수 있다. 기본은 소문자이며 uppercase 사용 시 대문자로 나타낸다. 문자열에는 영향을 미치지 않는다.
int num = 173;
std::cout << std::uppercase << std::showbase;
std::cout << std::hex << num << std::endl;
result)
다음은 공백과 정렬에 대한 함수이며 <iomanip> 헤더파일에 std::setw, std::setfill, std::setprecision 함수가 있다.
setw 함수는 output의 크기를 포함한 공백의 개수를 지정한다. 즉 setw(5)는 output의 크기가 5미만일 경우 나머지 크기를 공백으로 채운다.
setfill 함수는 공백을 원하는 문자로 채운다. setw 함수로 크기를 지정 후 setfill 함수를 통해 공백이 아닌 다른 문자로 채울 수 있다.
setprecision 함수는 소수의 자릿수를 지정할 수 있으며 정수부와 소수부를 합친 자릿수를 지정한다. 소수점 아래까지 나타날 경우 반올림된다.
setfill과 setprecision 함수는 cout에 저장되기 때문에 다시 초기화하지 않는 이상 계속해서 옵션이 저장된다.
std::showpoint는 소수점 아래의 표시 여부를 지정한다. 기본적으로 decimal형 변수가 100.0, 100.3 두 개일 경우 100.0은 소수점 아래를 표시하지 않고 100.3은 소수점 아래도 유효하므로 출력한다. 만약 showpoint를 cout에 저장하면 noshowpoint(default)로 지정할 때까지 소수점 아래가 유효하지 않더라도 모두 출력한다. std::left, std::internal, std::right는 output의 남는 칸의 여백을 채우는 것을 왼쪽, 가운데, 오른쪽으로 지정할 수 있다. 예제는 다음과 같다.
// showpoint, setprecision
double decimal1 = 100;
double decimal2 = 100.2;
double decimal3 = 123.42123;
std::cout << decimal1 << std::endl;
std::cout << decimal2 << std::endl;
std::cout << "-------------" << std::endl;
std::cout << std::showpoint;
std::cout << decimal1 << std::endl;
std::cout << decimal2 << std::endl;
std::cout << std::setprecision(5) << decimal3 << std::endl;
std::cout << "-------------" << std::endl;
// setw, left, internal, right
int num = -77;
std::cout << "|" << std::setw(6) << std::left << num << "|" << std::endl;
std::cout << "|" << std::setw(6) << std::internal << num << "|" << std::endl;
std::cout << "|" << std::setw(6) << std::right << num << "|" << std::endl;
// setfill
std::string str = "hello";
std::cout << "|" << std::setfill('*') << std::setw(8) << str << "|" << std::endl;
std::cout << "|" << std::setfill('*') << std::setw(8) << std::left << str << "|" << std::endl;
result)
'C,C++ > C++' 카테고리의 다른 글
[C++] 캐스팅 연산자에 대해 알아보자 | static_cast, reinterpret_cast (0) | 2020.01.23 |
---|---|
[C++] 클래스의 멤버가 저장되는 영역 및 메모리 차지 (2) | 2020.01.10 |
[C++] 가비지 컬렉션과 참조 카운트에 대해 알아보자 | 메모리 관리 자동화 (0) | 2019.12.30 |
[C++] C 스타일 enum과 C++ 11의 Enum class에 차이에 대해 알아보자 (0) | 2019.12.18 |
[C++] 가변 인자(Variable argument) 사용법을 알아보자 (0) | 2019.12.15 |
댓글