본문 바로가기

C++ (learncpp)/C++ Basics

1.5 — Introduction to iostream: cout, cin, and endl

이번 강의에서는 Hello world!에서 사용한 std::cout에 대해 더 자세히 알아보겠습니다. Hello world!라는 텍스트를 출력하는 프로그램 콘솔에. 또한 사용자로부터 입력을 받는 방법을 탐색하여 프로그램을 보다 대화식으로 만드는 데 사용할 것입니다.

 

입출력 라이브러리 (The input/output library)


입출력 라이브러리(io library)는 기본적인 입출력을 다루는 C++ 표준 라이브러리의 일부입니다. 이 라이브러리의 기능을 사용하여 키보드에서 입력을 받고 데이터를 콘솔로 출력합니다. iostream의 io 부분은 입력/출력을 의미합니다.

iostream 라이브러리 내에 정의된 기능을 사용하려면 다음과 같이 iostream에 정의된 콘텐츠를 사용하는 모든 코드 파일의 맨 위에 iostream 헤더를 포함해야 합니다.

 

#include <iostream>

// rest of code that uses iostream functionality here

 

std::cout

iostream 라이브러리에는 우리가 사용할 몇 가지 미리 정의된 변수가 포함되어 있습니다. 가장 유용한 것 중 하나는 std::cout입니다. 이것은 우리가 데이터를 콘솔로 보내 텍스트로 인쇄할 수 있게 해줍니다. cout은 "문자 출력"을 나타냅니다.

참고로 Hello World 프로그램은 다음과 같습니다.

 

#include <iostream> // for std::cout

int main()
{
    std::cout << "Hello world!"; // print Hello world! to console

    return 0;
}

 

이 프로그램에서는 std::cout에 액세스할 수 있도록 iostream을 포함했습니다. 메인 함수 내에서 삽입 연산자(<<)와 함께 std::cout를 사용하여 Hello world!라는 텍스트를 보냅니다. 인쇄할 콘솔로 이동합니다.

std::cout는 텍스트를 인쇄할 수 있을 뿐만 아니라 숫자도 인쇄할 수 있습니다.

 

#include <iostream> // for std::cout

int main()
{
    std::cout << 4; // print 4 to console

    return 0;
}

 

결과는 다음과 같습니다.

 

4

 

변수 값을 인쇄하는 데에도 사용할 수 있습니다.

 

#include <iostream> // for std::cout

int main()
{
    int x{ 5 }; // define integer variable x, initialized with value 5
    std::cout << x; // print value of x (5) to console
    return 0;
}

 

결과는 다음과 같습니다.

 

5

 

같은 줄에 둘 이상의 항목을 인쇄하려면 단일 명령문에서 삽입 연산자(<<)를 여러 번 사용하여 여러 출력을 연결(함께 연결)할 수 있습니다. 예를 들어:

 

#include <iostream> // for std::cout

int main()
{
    std::cout << "Hello" << " world!";
    return 0;
}

 

이 프로그램은 다음을 인쇄합니다.

 

Hello world!

 

다음은 동일한 명령문에서 텍스트와 변수 값을 모두 인쇄하는 또 다른 예입니다.

 

#include <iostream> // for std::cout

int main()
{
    int x{ 5 };
    std::cout << "x is equal to: " << x;
    return 0;
}

 

이 프로그램은 다음을 인쇄합니다.

 

x is equal to: 5

 

std::endl

 

이 프로그램에서 무엇을 인쇄할 것으로 예상하십니까?

 

#include <iostream> // for std::cout

int main()
{
    std::cout << "Hi!";
    std::cout << "My name is Alex.";
    return 0;
}

 

결과에 놀랄 수 있습니다.

 

Hi!My name is Alex.

 

별도의 출력 문은 콘솔에 별도의 출력 라인을 생성하지 않습니다.

콘솔에 별도의 출력 행을 인쇄하려면 커서를 다음 행으로 이동할 때 콘솔에 알려야 합니다.

그렇게 하는 한 가지 방법은 std::endl을 사용하는 것입니다. std::cout로 출력할 때 std::endl은 콘솔에 줄 바꿈 문자를 인쇄합니다(커서가 다음 줄의 시작 부분으로 이동하도록 함). 여기서 endl은 "end line"을 의미합니다.

예를 들어:

 

#include <iostream> // for std::cout and std::endl

int main()
{
    std::cout << "Hi!" << std::endl; // std::endl will cause the cursor to move to the next line of the console
    std::cout << "My name is Alex." << std::endl;

    return 0;
}

 

다음을 인쇄합니다.

 

Hi!
My name is Alex.

 

팁 (Tip)

위의 프로그램에서 두 번째 std::endl은 기술적으로 필요하지 않습니다. 프로그램이 직후에 종료되기 때문입니다. 그러나 이는 두 가지 유용한 목적을 제공합니다. 첫째, 출력 행이 "완전한 생각"임을 나타내는 데 도움이 됩니다(코드의 뒷부분에서 완료되는 부분 출력과 반대). 둘째, 나중에 출력 라인을 추가하려는 경우 기존 코드를 수정할 필요가 없습니다. 우리는 그것들을 추가할 수 있습니다.

 

std::endl vs '\n'

 

std::endl을 사용하는 것은 실제로 두 가지 작업을 수행하기 때문에 약간 비효율적일 수 있습니다. 커서를 다음 줄로 이동하고 출력을 "플러시"합니다(즉시 화면에 표시되는지 확인). std::cout를 사용하여 콘솔에 텍스트를 쓸 때 std::cout는 일반적으로 출력을 플러시합니다(그렇지 않으면 일반적으로 중요하지 않음). 따라서 std::endl 플러시를 갖는 것은 거의 중요하지 않습니다.

이 때문에 일반적으로 '\n' 문자를 대신 사용하는 것이 좋습니다. '\n' 문자는 커서를 다음 줄로 이동하지만 중복 플러시를 수행하지 않으므로 성능이 더 좋습니다. '\n' 문자도 더 짧고 기존 텍스트에 포함될 수 있기 때문에 읽기 쉬운 경향이 있습니다.

 

다음은 두 가지 방식으로 '\n'을 사용하는 예입니다.

 

#include <iostream> // for std::cout

int main()
{
    int x{ 5 };
    std::cout << "x is equal to: " << x << '\n'; // Using '\n' standalone
    std::cout << "And that's all, folks!\n"; // Using '\n' embedded into a double-quoted piece of text (note: no single quotes when used this way)
    return 0;
}

 

다음을 인쇄합니다.

 

x is equal to: 5
And that's all, folks!

 

'\n'이 단독으로 사용되어 커서를 다음 줄로 이동하는 경우 작은따옴표가 필요합니다. 이미 큰따옴표로 묶인 텍스트에 포함된 경우 작은따옴표가 필요하지 않습니다.

char (4.11 -- Chars)에 대한 강의에서 '\n'이 무엇인지 더 자세히 다룰 것입니다.

 

모범 사례

콘솔에 텍스트를 출력할 때 std::endl보다 '\n'을 선호합니다.

 

경고

'\n'은 슬래시가 아니라 백슬래시(C++의 모든 특수 문자와 마찬가지로)를 사용합니다. 대신 슬래시(예: '/n')를 사용하면 예기치 않은 동작이 발생할 수 있습니다.

 

std::cin

 

std::cin은 iostream 라이브러리에 정의된 또 다른 미리 정의된 변수입니다. std::cout는 삽입 연산자(<<)를 사용하여 콘솔에 데이터를 인쇄하지만 std::cin("문자 입력"을 나타냄)은 추출 연산자(>>)를 사용하여 키보드에서 입력을 읽습니다. 입력은 사용할 변수에 저장해야 합니다.

 

#include <iostream>  // for std::cout and std::cin

int main()
{
    std::cout << "Enter a number: "; // ask user for a number

    int x{ }; // define variable x to hold user input (and zero-initialize it)
    std::cin >> x; // get number from keyboard and store it in variable x

    std::cout << "You entered " << x << '\n';
    return 0;
}

 

이 프로그램을 컴파일하고 직접 실행해 보십시오. 프로그램을 실행하면 5행에 "Enter a number: "가 인쇄됩니다. 코드가 8행에 도달하면 프로그램은 입력을 입력할 때까지 기다립니다. 숫자를 입력하고 엔터를 누르면 입력한 숫자가 변수 x에 할당됩니다. 마지막으로, 10번째 줄에서 프로그램은 "당신이 입력했습니다"와 당신이 방금 입력한 숫자를 출력할 것입니다.

예를 들어 (내가 4를 입력했다면):

 

Enter a number: 4
You entered 4

 

이것은 사용자로부터 키보드 입력을 받는 쉬운 방법이며 앞으로 많은 예제에서 사용할 것입니다. 입력을 수락할 때 '\n'을 사용할 필요가 없습니다. 사용자가 입력을 수락하려면 Enter 키를 눌러야 하므로 커서가 다음 줄로 이동합니다.

숫자를 입력한 직후 화면이 닫히면 단원 0.8 -- 해결을 위한 몇 가지 일반적인 C++ 문제를 참조하십시오.

한 줄에 두 개 이상의 텍스트를 출력할 수 있는 것처럼 한 줄에 두 개 이상의 값을 입력하는 것도 가능합니다.

 

#include <iostream>  // for std::cout and std::cin

int main()
{
    std::cout << "Enter two numbers separated by a space: ";

    int x{ }; // define variable x to hold user input (and zero-initialize it)
    int y{ }; // define variable y to hold user input (and zero-initialize it)
    std::cin >> x >> y; // get two numbers and store in variable x and y respectively

    std::cout << "You entered " << x << " and " << y << '\n';

    return 0;
}

 

이렇게 하면 다음과 같이 출력이 됩니다.

 

Enter two numbers separated by a space: 5 6
You entered 5 and 6

 

모범 사례 (Best practice)

사용자가 제공한 값이 초기화 값을 덮어쓸 것이기 때문에 다른 소스(예: std::cin)를 통해 사용자가 제공한 값을 주기 직전에 변수를 초기화해야 하는지 여부에 대해 약간의 논쟁이 있습니다. 변수는 항상 초기화해야 한다는 이전 권장 사항에 따라 변수를 먼저 초기화하는 것이 가장 좋습니다.

 

우리는 std::cin이 어떻게 잘못된 입력을 처리하는지 미래 강의에서 논의할 것입니다(7.16 -- std::cin 및 잘못된 입력 처리(7.16 -- std::cin and handling invalid input)).

 

고급 독자용 (For advanced readers)

C++ I/O 라이브러리는 사용자가 Enter 키를 누르지 않고 키보드 입력을 수락하는 방법을 제공하지 않습니다. 이것이 원하는 것이라면 타사 라이브러리를 사용해야 합니다. 콘솔 애플리케이션의 경우 pdcurses 라이브러리를 권장합니다. 많은 그래픽 사용자 라이브러리에는 이러한 종류의 작업을 수행하는 고유한 기능이 있습니다.

 

Summary (요약) 

새 프로그래머는 종종 std::cin, std::cout, 삽입 연산자(<<) 및 추출 연산자(>>)를 혼동합니다. 기억하기 쉬운 방법은 다음과 같습니다.

 

  • std::cin 및 std::cout는 항상 문의 왼쪽에 있습니다.
  • std::cout는 값을 출력하는 데 사용됩니다(cout = 문자 출력)
  • std::cin은 입력 값을 가져오는 데 사용됩니다(cin = 문자 입력).
  • <<는 std::cout와 함께 사용되며 데이터가 이동하는 방향을 보여줍니다(std::cout이 콘솔을 나타내는 경우 출력 데이터는 변수에서 콘솔로 이동함). std::cout << 4는 4의 값을 콘솔로 이동합니다.
  • >>는 std::cin과 함께 사용되며 데이터가 이동하는 방향을 보여줍니다(std::cin이 키보드를 나타내는 경우 입력 데이터가 키보드에서 변수로 이동함). std::cin >> x는 사용자가 키보드에서 입력한 값을 x로 이동합니다.

연산자에 대한 자세한 내용은 1.9과 - 리터럴 및 연산자 소개(1.9 -- Introduction to literals and operators)에서 다루겠습니다. 

 

reference : https://www.learncpp.com/cpp-tutorial/introduction-to-iostream-cout-cin-and-endl/