![[C++] C++ 표준 입출력 클래스](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs46qn%2FbtsL5tViem7%2FD5DTf8zLw0eSbfinlmL8GK%2Fimg.png)
[C++] C++ 표준 입출력 클래스Dev/C++2025. 2. 3. 01:08
Table of Contents
이 글은 C++에서 가장 기본이 되는 표준 입출력 방법에 대해 정리한 글이다.
C++ 입출력의 기본 개념
표준 라이브러리 (iostream)
- C++에서 가장 기본이 되는 입출력 기능은
iostream
헤더에 정의 #include <iostream>
을 통해 표준 입출력 객체(std::cin
,std::cout
,std::cerr
,std::clog
) 등 사용 가능
#include <iostream> // iostream 헤더 포함
int main() {
std::cout << "Hello, World!" << std::endl; // 표준 출력
return 0;
}
네임스페이스와 using 구문
- 표준 라이브러리는
std
라는 네임스페이스를 사용 - 모든 표준 라이브러리 요소는
std::
라는 접두사를 붙이거나,using namespace std;
구문을 통해 네임스페이스 생략 가능
// 1) std::cout 방식
std::cout << "Input a number: " << std::endl;
// 2) using namespace std 방식
using namespace std;
cout << "Input a number: " << endl;
규모가 큰 프로젝트나 협업 환경에서는using namespace std;
로 인한 네임스페이스 충돌을 방지하기 위해std::
를 명시적으로 사용하는 경우가 많다.
표준 출력 (std::cout)
기본 사용 : 삽입 연산자
- C++에서 출력은 삽입 연산자(
<<
)를 이용하여 데이터를 출력 스트림(출력 장치)으로 보내는 방식 - 문자열, 정수, 실수 등 다양한 자료형을
<<
로 이어 붙일 수 있음
#include <iostream>
int main() {
int number = 10;
std::cout << "number의 값은: " << number << std::endl;
std::cout << "이 문장은 한 줄에 바로 이어서 "
<< "출력할 수도 있습니다." << std::endl;
return 0;
}
std::endl
은 줄바꿈을 수행함과 동시에 출력 버퍼를 비우는 역할(flush
)을 함께 수행하기 때문에 출력 버퍼를 매번 지우는std::endl
은 성능에 영향을 줄 수 있다. 단순이 줄바꿈을 필요로 하는 경우에는"\n"
을 사용할 수도 있다.
(알고리즘 문제를 푸는 경우,std::endl
대신"\n"
을 사용하면 시간 초과를 해결할 수 있는 경우도 있다.)
다앙한 자료형 출력
std::cout
은 오버로딩된operator<<
를 통해 기본 자료형(int
,float
,bool
등)과std::string
등을 편리하게 출력 가능- C언어 스타일로 입출력을 수행하면
printf("%d". number);
와 같이 서식 지정자를 직접 맞춰야 함 - 반면, C++에서는
std::cout << number;
와 같이 따로 형식을 지정하지 않아도 연산자 오버로딩 덕분에 자동으로int
를 출력하는 함수를 호출
- C언어 스타일로 입출력을 수행하면
std::cout << 42 << std::endl; // 정수 출력
std::cout << 3.14 << std::endl; // 실수 출력
std::cout << std::boolalpha << true; // boolalpha 사용 시 "true"/"false"
std::boolalpha
를 사용하면bool
타입 변수를1
혹은0
대신true
혹은false
형태로 출력하도록 전환
입출력 조정 (manipulators)
<iomanip>
헤더에 정의된 다양한 입출력 조정자(manipulator)가 존재- 고정 소수점 자릿수 지정 :
std::fixed
,std::setprecision
- 필드 폭 지정 :
std::setw
- 고정 소수점 자릿수 지정 :
#include <iostream>
#include <iomanip>
int main() {
double pi = 3.14159265;
std::cout << std::fixed << std::setprecision(2) << pi << std::endl; // 3.14
std::cout << std::setw(10) << 123 << std::endl; // 폭 10칸 확보
return 0;
}
표준 입력 (std::cin)
기본 사용 : 추출 연산자
- std::cin은 입력 스트림(ex. 키보드 입력)에서 데이터를 읽어오는 역할
- 추출 연산자(
>>
)를 통해 입력 버퍼로부터 원하는 자료형의 데이터를 가져올 수 있음
#include <iostream>
int main() {
int x;
std::cout << "정수를 입력하세요: ";
std::cin >> x; // x에 사용자가 입력한 정수 값을 저장
std::cout << "입력된 값은: " << x << std::endl;
return 0;
}
입력을 받을 때 공백, 탭, 줄바꿈 등 구분 문자를 만나면 해당 변수로의 입력이 종료된다.
여러 값 연속 입력
- 여러 변수를 한 줄에 입력 받거나, 여러 줄에 걸쳐 입력을 받는 경우,
>>
연산자를 연속해서 사용할 수 있음
int a, b;
std::cout << "두 개의 정수를 입력하세요: ";
std::cin >> a >> b; // 공백으로 구분된 두 정수 입력
std::cout << a << " + " << b << " = " << (a + b) << std::endl;
문자열 입력
std::cin >> str;
형태의 문자열 입력은 공백 전까지의 문자열만 입력- 공백이 포함된 문자열을 입력받는 경우,
std::getline(std::cin, str);
을 사용
#include <iostream>
#include <string>
int main() {
std::string name;
std::cout << "이름을 입력하세요: ";
// std::cin >> name; // 공백 전까지 읽음
std::getline(std::cin, name); // 공백 포함 한 줄 전체를 읽음
std::cout << "안녕하세요, " << name << "님!" << std::endl;
return 0;
}
입력 버퍼 및 주의사항
std::cin >> var;
을 통해 입력을 받은 뒤, 버퍼에 남아 있는 공백 문자나 줄바꿈이 이후 입력 연산에 영향을 줄 수 있음std::cin.ignore()
나std::cin.clear()
등을 적절히 사용하여 방지 가능std::cin.ignore()
: 지정한 문자의 수 혹은 특정 구분 문자가 나올 때까지 입력 버퍼를 비우는 역할std::cin.clear()
: 입력 스트림의 오류 상태를 해제 (ex. 잘못된 형식이 들어간 경우)
std::cin >> x;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
// 혹은 std::cin.ignore(100, '\n'); 처럼 충분한 길이만큼 무시
std::string line;
std::getline(std::cin, line); // 앞서 남아 있는 '\n' 버퍼 문제를 방지
성능 관련 팁 : 동기화와 버퍼 관리
- C++ 표준 라이브러리는 C 표준 라이브러리(
stdio.h
)와 스트림을 동기화하여stdio.h
와iostream
간에 혼합 사용 시 버퍼 충돌을 방지 - 입출력 성능을 극대화해야하며, C 함수(
prinf()
,scanf()
)와 혼용하지 않는다면,std::ios::sync_with_stdio(false);
와std::cin.tie(nullptr);
를 통해 동기화를 해제하면 더 빠른 입출력이 가능
#include <iostream>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
// 빠른 입출력 코드
return 0;
}
위 방법은 알고리즘 문제에서 큰 데이터를 다룰 때 성능 향상을 목적으로 자주 사용되지만,stdout
과iostream
을 동시에 사용하면 예상하지 못하는 문제가 발생할 수 있으므로 사용에 주의가 필요하다.
핵심 요약
- C++에서 입출력은 가장 기초적이면서도 전역적으로 사용하는 기능
- 입력은
std::cin >> 변수;
의 형태로, 출력은std::cout << 값;
의 형태로 사용
'Dev > C++' 카테고리의 다른 글
[C++] C++의 기본 연산자 (산술, 대입, 증감, 비교, 논리 연산자) (0) | 2025.02.20 |
---|---|
[C++] C++의 변수와 상수, 그리고 자료형 (variables & constant & data type) (0) | 2025.02.10 |
[C++] VSCode를 이용한 C++ 개발 환경 세팅 가이드 (0) | 2025.02.02 |
@청월누리 :: DevKuk 개발 블로그
since 2025.01.27. ~ 개발자를 향해....🔥