C++ 입출력 라이브러리
C++언어에서의 입출력을 사용하기 위해서는 <iostream> 라이브러리를 사용해야 한다.
이 라이브러리에는 표준 입력과 표준 출력을 다루는 객체들이 정의되어 있다.
C++에서의 <iostream>은 C에서의 <stdio.h>와 같다.
#include <iostream>
표준 출력 : 기본적인 출력
C++에서 표준 출력은 'std::cout' 객체를 사용하여 데이터를 출력할 수 있다.
cout은 "character output"을 의미하며, 텍스트 데이터를 표준 출력 장치(콘솔 또는 터미널등)
에 출력하는데 사용됩니다.
std::cout 객체를 사용하여 데이터를 출력할 수 있다.
stream 출력연산자 '<<' 와 함께 사용된다.
'<<'연산자는 출력할 값을 'cout'객체에 전달한다.
C++에서의 출력은 C의 출력에 필요한 서식문자가 필요 없다.
C++은 강력한 정적 타입 언어로서, 변수의 타입이 컴파일 시간에 결정된다.
변수의 타입을 컴파일러가 알고 있기에 해당 타입에 맞는 출력 방식을 자동으로 선택한다.
그러한 이유로 서식 지정자를 사용할 필요가 없다.
이를 통해 코드가 더 안전하고 유연해지며, 타입 오류를 미리 방지 가능하다.
int num = 11;
std::cout << "C++ " << num << std::endl;
아래의 코드처럼 using namesapce std를 사용하면 std:: 를 생략할 수 있다.
using namespace std;
int num = 11;
cout << "C++ " << num << endl;
표준 출력 : 형식화된 출력
서식 지정자를 사용하여 출력 형식을 지정할 수 있다.
일반적으로 'std::cout' 객체와 'std::setw', 'std::setprecision', 'std::fixed'
등의 함수와 조합하여 사용한다.
위의 함수들을 사용하려면 <iomanip> 헤더 파일을 사용해야 한다.
- std::setw(n) : 필드 폭을 n으로 설정한다. 출력 데이터를 오른쪽 정렬하고 필요한 경우 공백 추가.
- std::setprecision(n) : 부동 소수점 숫자의 소수점 이하 자릿수를 n으로 설정
- std::setfill(c) : 빈 필드를 채우는 문자를 c로 설정
- std::setiosflags(flags) : 출력 상태 플래그를 설정 예를 들어, flags에 std::ios:fixed를 넣으면 소수점 이하 자릴수를 고정할 수 있다.
표준 출력 : 문자열 출력
'std::cout'객체와 '<<' 연산자를 사용해 C스타일 문자열인 char형 배열,
C++문자열 클래스 std::string문자열을 출력할 수 있다.
표준 출력 : 특수 문자 출력
std::cout 객체와 이스케이프 시퀀스를 사용하여 특수 문자를 출력할 수 있다.
일반적인 이스케이프 시퀀스로는 '\n'(개행), '\t'(탭)등이 있다.
출력 버퍼
std::cout 은 출력을 처리하기 위해 출력 버퍼를 사용한다.
출력 버퍼에 출력 내용이 쌓이며, 버퍼가 가득 차거나 개행 문자를 만나면
버퍼의 내용이 터미널, 콘솔창에 출력된다.
버퍼를 비우기 위해 'std::endl' 이나 'std::flush'를 사용한다.
std::endl 과 std::flush는 모두 출력 버퍼를 비우는 목적으로 사용되지만,
동작 방식에 차이가 있다.
std::endl
- 개행 문자('\n')를 출력하고, 출력 버퍼를 비운다.
- 개행 문자를 출력하기에 출력 내용을 새로운 줄로 이동시킨다.
- 출력 버퍼를 비우면서 개행을 수행하여 출력 내용을 보기 좋게 정리할 수 있다.
std::flush
- 출력 버퍼를 비우는 역할만 수행
- 출력 버퍼를 비우고, 출력한 내용을 즉시 출력 장치에 표시
- 개행 문자를 출력하지 않고, 출력 내용을 현재 줄에 유지
- 즉각적인 출력을 위해 사용되며, 버퍼에 저장된 데이터를 즉시 표시할 때 유용
표준 입력 : 기본적인 입력
C++에서 표준 입력은 'std::cin' 객체를 사용하여 처리됩니다.
cin은 "character input"을 의미하며, 키보드를 통해서 데이터를 입력받습니다.
std::cin 객체를 사용하여 사용자로부터 데이터를 입력받는다.
stream 입력연산자 '>>'와 함께 사용된다.
'>>' 연산자는 입력 값을 변수에 할당합니다.
cin 객체는 공백 문자(스페이스, 탭, 엔터)를 기준으로 입력을 구분받는다.
사용자가 키보드로 엔터키를 누르면 입력된 문자열은 버퍼에 저장되며
cin을 통해 가져올 수 있다. C에서는 call by reference가 없어서
scanf를 사용할 때 포인터형으로 입력값을 받지만,
C++에서는 call by reference가 있어서 cin를 사용할 때
레퍼런스로 값을 받는다.
C 입력에서는 서식문자 또한 받지만, C++ 입력에서는 변수명만
아래의 코드에서처럼 넣어주면 된다.
int num;
scanf("%d", &num); // C 입력방식
std::cin >> num >> std::endl; // C++ 입력방식
입력 값에 대한 변수의 유효성
입력 값을 변수에 할당하기 전에 변수의 유효성을 확인하는 것이 좋다.
"변수의 유효성을 확인한다"는 것은 값을 변수에 할당하기 전에 해당 변수가
유효한 값인지를 확인하는걸 의미한다.
입력 값이 변수의 예상 범위를 벗어나거나 유효하지 않은 형식을 가질 경우,
'std::cin' 은 입력을 실패하고, 입력 버퍼에 잘못된 값이 남게 됩니다.
아래의 코드처럼 변수가 int형이지만 char형이나 double형을 넣을 경우가 이에 해당합니다.
int num
std::cin >> num; // 'A' or '3.14' 입력
'std::cin.fail()'함수를 사용하여 입력이 실패했는지 확인 가능하다.
입력이 실패한 경우에 해당 변수를 올바른 값으로 설정하거나 예외 처리를 할 수 있다.
입력 버퍼에 잘못된 값이 남아있을 수 있어서 이를 비우기 위한'std::cin.clear()' 와
'std::cin.ignore()' 함수를 아래의 코드처럼 사용할 수 있다.
int num;
std::cin >> num;
if (std::cin.fail()) {
std::cout << "올바른 입력이 아닙니다." << std::endl;
std::cin.clear(); // 오류 플래그 초기화
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 입력 버퍼 비우기
}
표준 입력 : 문자열 입력
'std::cin'객체와 'std::getline()'함수를 사용하여 문자열을 입력받을 수 있다.
'std::getline()' 함수를 사용하면 공백을 포함한 한 줄의 문자열을 입력받을 수 있다.
입력 버퍼
'std::cin' 객체를 사용하여 입력을 받을 때, 입력 버퍼에는 개행 문자(Enter 키로 인해 생성되는)나
공백등이 남을 수 있다. 그러한 입력 버퍼에 남은 문자를 제거하기 위해
'std::cin.ignore()' 함수를 사용하거나 'std::cin' 객체를 사용하거나 std::getline() 함수를
사용하여 입력 버퍼를 비울 수 있다.
입출력함수 주의사항
1. 입력 버퍼 청소:
사용자로부터 입력을 받을때, 입력 버퍼에 개행 문자나 공백 등이 남을 수 있다.
이러한 남은 문자들은 의도치 않은 동작을 하게 만든다.
입력 버퍼에 남은 문자를 제거하기 위해 std::cin.ignore() 함수를 사용하거나
std::cin 객체를 사용하거나 std::getline()함수를 사용해 입력 버퍼를 비울 수 있다.
2. 변수 유효성 확인:
입출력 함수를 사용하여 값을 입력받을 때, 입력된 값이 변수의 범위를 벗어나거나
유효하지 않은 형식일 수 있다. 입력 값을 사용하기 전에 유효성을 확인하고,
필요에 따라 예외 처리를 수행해야 한다.
3 파일 입출력:
파일 입출력을 사용할 때는 파일을 성공적으로 열었는지 확인해야 한다.
파일이 성공적으로 열리지 않은 경우, 해당 파일에 대한 작업은 수행되지 않으므로
예외처리가 반드시 필요하다. 파일 작업이 완료되면, 파일을 꼭 닫아야 한다.
4 입력 값의 크기와 형식:
입력받는 값의 크기가 변수의 크기를 초과하거나 형식이 일치하지 않을 경우,
의도치 않은 동작이 발생할 수 있다.
변수의 크기에 맞게 입력을 받거나 형식 변환을 통해 올바른 값을 처리해야 한다.
'C++' 카테고리의 다른 글
| 참조자(Reference) (0) | 2023.05.30 |
|---|---|
| 네임스페이스(namespace) (0) | 2023.05.30 |
| 객체에 대한 이해 (0) | 2023.05.30 |
| 제네릭 프로그래밍 (0) | 2023.05.30 |
| 함수 오버로딩(Function Overloading) & 함수 오버라이딩(Function Overriding) (0) | 2023.05.30 |