Qaupot Blog
Software Engineering, Trip

308. 표준 입출력

🕐 Wed, 05 Mar 2014 09:00:00 GMT 🕓 Sun, 05 Sep 2021 12:24:00 GMT

스트림 (Stream)

Stream 은 사전적 의미로 줄기, 흐름, 연속적 등을 의미하고, 컴퓨터 공학에서는 어떠한 연속적인 데이터의 흐름 경로를 말합니다.

쉽게 비유하면, '화폐 교환' 표현을 사용할 수 있습니다.

  • 한국에서는 원화를, 일본에서는 엔화를 사용합니다. 그리고 두 국가의 화폐 교환을 기축통화 달러화로 정합니다.
  • 한국에서 일본으로 돈을 보낼때는 원화 -> 달러화 -> 엔화 순서를 거칩니다.
  • 일본에서 한국으로 돈을 보낼때는 엔화 -> 달러화 -> 원화 순서를 거칩니다.

"달러화 교환" 이라는 Stream 경로를 통해 두 국가의 화폐는 교환될 수 있습니다.

스트림은 데이터의 독립성을 보장합니다.

원본 데이터가 어떠한 형태로 저장되어 있는지 모르더라도, 프로그래머들 사이에서 약속한 스트림 규격에 따라 데이터를 주고 받으면, 각 데이터는 호환된다고 말할 수 있습니다.

  • 물리적 장비와 데이터 사이의 관계 뿐 아니라, 데이터와 데이터 사이의 관계 등에도 폭 넓게 사용됩니다.

C++에서의 표준 입출력

C++ 에서의 표준 입출력은 스트림 개념에 의해 정의됩니다.
입력 istream, 출력 ostream, 입출력 iostream 등 다소 복잡한 상속관계에 의해 정의되지만, 여기서는 표준입출력 방법에 대해서만 소개합니다.

#include <iostream>

int main(int argc, char** argv)
{
    // 출력 폭
    std::cout.width(20); 
    std::cout << "Hello" << " World" << std::endl;

    // 채우기
    std::cout.width(20);
    std::cout.fill('*');
    std::cout << "Hello" << " World" << std::endl;
    std::cout.fill(' ');

    // 정렬 지정
    std::cout.width(20);
    std::cout << std::left << "Hello World" << std::endl;
    std::cout.width(20);
    std::cout << std::internal << "Hello World" << std::endl;
    std::cout.width(20);
    std::cout << std::right << "Hello World" << std::endl;

    std::cout << std::hex << 1024 << std::endl; // 16진수
    std::cout << std::oct << 1024 << std::endl; // 8진수

    // 실수 정밀도
    std::cout << 0.12345678f << std::endl;
    std::cout.precision(3);
    std::cout << 0.12345678f << std::endl;
    std::cout.precision(10);
    std::cout << 0.12345678f << std::endl;

    return 0;
}
Hello World
Hello World
Hello World
Hello World
Hello World
400
2000
0.123457
0.123
0.1234567836

std 네임스페이스의 cout 은 출력에 관한 표준 입출력 객체입니다.

  • <<연산자가 직관적으로 오버로딩 되어 있으며, 데이터를 왼쪽으로 (cout 방향으로) 보낸다는 의미를 담습니다.
  • 주의하실 부분은, width 메소드는 다음 출력 1회에 한해서만 적용됩니다.
#include <iostream>
#include <string>

int main(int argc, char\*\* argv)
{
    int number;
    char str\[256\];
    std::string strClass;

    std::cin >> number;
    std::cout << number << std::endl;
    std::cin >> str;
    std::cout << str << std::endl;
    std::cin >> strClass;
    std::cout << strClass << std::endl;
}

입력 데이터 :

4 Hello Hello

출력 데이터 :

4
Hello
Hello

std 네임스페이스의 cin 은 입력에 관한 표준 입출력 객체입니다.

  • 이 클래스는 띄어쓰기를 기준으로 데이터를 받습니다.
  • 띄어쓰기는 문자열을 토큰으로 나눌때 쓰는 가장 대표적 방법중 하나이며, 공백문자를 받기 위해서는 별도의 방법을 사용해야 합니다.

만약 읽어들이지 못하는 무효의 경우가 발생한 경우 해당 위치에서 입력이 중단됩니다.

  • 처리 못한 입력데이터가 버퍼에 남아 있을 경우 다음 std::cin 에서 처리됩니다.
  • 의도하지 않는 경우라면, 버퍼를 별도로 비워줘야 합니다.

cin 의 clear 메소드는 버퍼를 비워주는 메소드가 아닙니다.

  • fflush(stdin); 같은 C 스타일의 코드로 비우거나 cin 클래스의 다른 메소드들을 조합하여 비워야 합니다.
이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.