newclass 2025. 3. 27. 23:04

2.3 입출력

2.3.1 표준 입출력 스트림

C++에서는 <iostream> 헤더에 정의된 스트림 객체를 통해 입출력을 처리합니다:

  • std::cout: 표준 출력 (콘솔에 출력)
  • std::cin: 표준 입력 (키보드로부터 입력)
  • std::cerr: 표준 오류 (오류 메시지 출력)
  • std::clog: 표준 로그 (로그 메시지 출력)
#include <iostream>

int main() {
    // 표준 출력
    std::cout << "안녕하세요!" << std::endl;
    
    // 여러 값 연결
    int age = 25;
    std::cout << "나이: " << age << "세" << std::endl;
    
    // 오류 메시지
    std::cerr << "오류: 파일을 찾을 수 없습니다." << std::endl;
    
    return 0;
}

2.3.2 스트림 조작자

출력 형식을 제어하는 조작자(manipulator):

#include <iostream>
#include <iomanip>  // 조작자를 위한 헤더

int main() {
    double pi = 3.14159265359;
    
    // 고정 소수점 표기와 정밀도 지정
    std::cout << "기본: " << pi << std::endl;  // 3.14159
    std::cout << "고정: " << std::fixed << pi << std::endl;  // 3.141593
    std::cout << "고정(2자리): " << std::fixed << std::setprecision(2) << pi << std::endl;  // 3.14
    
    // 과학적 표기법
    std::cout << "과학: " << std::scientific << pi << std::endl;  // 3.141593e+00
    
    // 필드 너비와 채우기
    std::cout << "너비(10): " << std::setw(10) << pi << std::endl;  // '    3.14'
    std::cout << "채우기: " << std::setfill('*') << std::setw(10) << pi << std::endl;  // '****3.14'
    
    // 진법 변경
    int num = 255;
    std::cout << "10진수: " << num << std::endl;  // 255
    std::cout << "16진수: " << std::hex << num << std::endl;  // ff
    std::cout << "8진수: " << std::oct << num << std::endl;  // 377
    
    // 불리언 값 출력
    bool flag = true;
    std::cout << "기본: " << flag << std::endl;  // 1
    std::cout << "문자: " << std::boolalpha << flag << std::endl;  // true
    
    return 0;
}

2.3.3 기본 입력 처리

#include <iostream>
#include <string>

int main() {
    // 정수 입력 받기
    int age;
    std::cout << "나이를 입력하세요: ";
    std::cin >> age;
    std::cout << "입력한 나이: " << age << std::endl;
    
    // 여러 값 입력 받기
    int x, y;
    std::cout << "두 정수를 입력하세요: ";
    std::cin >> x >> y;
    std::cout << "합: " << x + y << std::endl;
    
    // 문자열 입력 받기
    std::string name;
    std::cout << "이름을 입력하세요: ";
    std::cin >> name;  // 공백 전까지만 입력 받음
    std::cout << "안녕하세요, " << name << "님!" << std::endl;
    
    // 입력 버퍼 비우기
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    
    // 공백을 포함한 문자열 입력 받기
    std::string fullName;
    std::cout << "전체 이름을 입력하세요: ";
    std::getline(std::cin, fullName);  // 한 줄 전체 읽기
    std::cout << "환영합니다, " << fullName << "님!" << std::endl;
    
    return 0;
}

2.3.4 입력 검증 및 오류 처리

#include <iostream>
#include <limits>

int main() {
    int number;
    bool validInput = false;
    
    while (!validInput) {
        std::cout << "양수를 입력하세요: ";
        std::cin >> number;
        
        if (std::cin.fail()) {  // 입력 실패 (예: 문자를 입력)
            std::cin.clear();  // 오류 상태 초기화
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');  // 버퍼 비우기
            std::cout << "오류: 숫자를 입력하세요." << std::endl;
        } else if (number <= 0) {  // 논리적 오류
            std::cout << "오류: 양수를 입력하세요." << std::endl;
        } else {
            validInput = true;  // 유효한 입력
        }
    }
    
    std::cout << "입력한 값: " << number << std::endl;
    return 0;
}