1. C 와 C++ 출력의 차이
- c의 출력
printf("test");
printf("Hello , %s%d\n", "test", 123);
- c++의 출력
std::cout << "test" << std::endl;
std::cout << "Hello ," << "test" << 123 << std::endl;
위와 같이 서로 다른 형태를 가지고 있다.
c++ 코드에서 std :: 이 놈의 정체는 뭘까? 그리고 또 << 이 기호는 비트연산자 인데 출력에서는 왜 쓰이는 걸까? 한번 알아보도록 하자.
2. 네임스페이스 ( namespace )
- Java의 패키지, C#의 네임스페이스와 비슷하다.
- C++에서 변수, 함수, 클래스 등의 식별자(Identifier)가 서로 충돌하지 않도록 관리하기 위해 제공되는 선언적 영역.
[1] 네임스페이스의 특징
- 이름 충돌 방지 : 여러 개발자가 동일한 이름의 함수나 변수를 정의하더라도, 네임스페이스를 통해 각각 구분할 수 있다.
- 논리적 그룹화 : 관련된 함수와 변수를 하나의 네임스페이스로 묶어 코드 가독성, 관리성을 높일 수 있다.
- 중첩 가능 : 네임스페이스 안에 또 다른 네임스페이스 선언 가능.
[2] 사용법
namespace MyNamespace
{
int value = 10;
void printValue()
{
std::cout << "Value: " << value << std::endl;
}
}
네임스페이스 내부의 요소에 접근하려면 범위 지정 연산자 " : : " 를 사용한다.
MyNamespace::printValue();
[3] 표준 네임스페이스 ( std )
- C++ 표준 라이브러리의 모든 요소들은 " std " 라는 네임스페이스에 포함되어 있다.
- 예를 들어, " std :: cout " 과 같은 방식으로 표준 출력 스트림을 사용할 수 있다.
[4] using 지시자와 선언
- using 지시자 : 특정 네임스페이스의 모든 요소를 범위 지정 없이 사용할 수 있게 한다. ( 타이핑 횟수 감소 )
using namespace std;
cout << "Hello World!" << endl;
- using 선언 : 특정 요소만 범위 지정 없이 사용하도록 허용할 수도 있다.
using std::cout;
cout << "Hello World!" << endl;
3 . << 연산자
- " << " 는 비트연산자 이기도 하지만, 데이터를 출력 스트림에 삽입하는 연산자이기도 하다.
- 예를들어, " std::cout << "Hello ,World!\n"; " 는 문자열 "Hello ,World!" 를 표준 출력(모니터,화면)에 출력한다.
- 이 연산자는 왼쪽 피연산자( std :: cout ) 가 출력스트림 객체이고, 오른쪽 피연산자가 출력할 데이터이다.
4. 조정자 ( Manipulator )
- C++에서 조정자(Manipulator)는 입출력 스트림 ( "std::cin , std::cout " ) 의 형식을 조정하거나 데이터를 특정한 방식으로 표시할 수 있도록 도와주는 도구다.
- 조정자는 함수처럼 동작하며, 스트림과 함께 사용되어 출력 형식을 간단하고 직관적으로 변경할 수 있다.
[1] 조정자의 역할
- 출력 형식 변경 : 숫자의 진법 변경, 소수점 자시수 지정 등등..
- 텍스트 정렬 및 채우기 : 출력 내용을 왼쪽, 오른쪽, 가운데 정렬하거나 빈 공간을 특정 문자로 채움.
- 특수한 데이터 표현 : 부호 표시, 진법 접두사 추가 등등 ..
[2] 예제
- 줄바꿈 : " std :: endl "
std::cout << "Hello" << std::endl; // "Hello" 출력 후 줄바꿈
- 진법 변경 : " std : : dec " , " std : : oct " , " std : : hex "
int number = 123;
std::cout << std::dec << number << std::endl; // 123 (10진수)
std::cout << std::oct << number << std::endl; // 173 (8진수)
std::cout << std::hex << number << std::endl; // 7b (16진수)
- 부호 표시 : " std :: showpow " , " std : : noshowpos "
std::cout << std::showpos << 123 << std::endl; // +123
std::cout << std::noshowpos << 123 << std::endl; // 123
- 소수점 자리수 지정 : " std :: setprecision "
double pi = 3.14159265358979;
std::cout << std::setprecision(3) << pi << std::endl; // 3.14
- 고정 소수점 표시 : " std : : fixed "
std::cout << std::fixed << std::setprecision(2) << pi << std::endl; // 3.14
- 출력 폭 설정 : " std : : setw "
int num = 42;
std::cout << std::setw(5) << num << std::endl; // " 42" (오른쪽 정렬)
- 정렬 방식 : " std : : left " , " std : : right " , " std :: internal "
std::cout << std::left << std::setw(5) << num; // "42 "
std::cout << std::right << std::setw(5) << num; // " 42"
std::cout << std::internal << std::setw(5) << -42; // "- 42"
- 채우기 문자 설정 : " std : : setfill "
std::cout << std::setfill('*') << std::setw(5) << num; // "**42"
- 진법 접두사 표시 : " std : : showbase " , " std : : noshowbase "
int num = 123;
std::cout << std::showbase << std::hex << num; // "0x7b"
- 대소문자 설정 : " std : : uppercase " , " std : : nouppercase "
int num = 123;
std::cout << std::uppercase << std::hex << num; // "7B"
[3] 조정자의 특징
- 조정자는 대부분 <iomainip> 헤더파일에 정의되어 있다.
- 조정자의 설정은 지속되며, 다시 변경하거나 초기화하지 않는 한 계속 유지된다.
- 함수처럼 호출되지만 실제로는 연산자 오버로딩과 결합되어 동작한다
