티스토리 뷰

문자열 "Hello World"의 출력

기본적인 실행방법은 C 프로그램의 실행방식과 동일합니다. 하지만 파일의 이름을 지정할 때, 확장자는 .c가 아닌 .cpp로 해야합니다.

그래야지만 C++ 문법규칙을 적용한 C++ 컴파일러로 컴파일이 되기 때문입니다.

#include <iostream>

int main(void) {
    int num = 20;
    std::cout << "Hello World!" << std::endl;
    std::cout << "Hello " << "world!" << std::endl;
    std::cout << num << ' ' << 'A';
    std::cout << ' ' << 3.14 << std::endl;
    return 0;
}

위의 소스코드를 실행하기 되면 출력에 관한 몇 가지 특성을 파악할 수 있게 됩니다.

아직은 초보자이기 때문에 무조건 이해할려고 하지 말고 코드를 관찰하고 관심이 가지게 되면 이해가 되게 될 겁니다.

  • 헤더파일 선언문 #include<iostream>
  • std::cout과 <<을 이용한 출력
  • std::endl을 이용한 개행

그럼 아래서 이들에 대해 보다 구체적으로 설명해 보겠습니다.

관찰결과 1 : 헤더파일 선언문 #include<iostream>

C언어에서는 입출력을 위한 printf 함수와  scanf 함수의 호출을 목적으로 헤더파일 <stdio.h>를 포함 했다면, C++에서는 입출력에 관련된 일을 하기 위해서 다음 형태의 헤더 파일 선언을 추가해야 합니다.

#include<iostream>

만약에 이 문장을 생략하면 다음과 같은 유형의 에러 메시지를 만나게 될 겁니다.

"std, cout, endl은 무엇인가요?"

즉, std, cout, endl을 사용하기 위해서 위에서 언급한 헤더파일 선언문을 추가해야 합니다.

그런데 위의 헤더 파일 선언문을 보면서 다음과 같은 생각이 듭니다.

"C++의 헤더파일에는 확장자가 없나요?"

아닙니다. 헤더파일의 확장자는 C언어와 마찬가지로 .h입니다.

그러나 C++에서는 프로그래머가 정의하는 헤더파일의 선언이 아닌, 표준 헤더파일의 선언에서는 확장자를 생략하기로 약속되어 있습니다.

쉽게 말해서 개발자 직접 헤더파일을 제작하는 경우에는 헤더파일의 확장자인 .h을 포함하여서 선언해야 합니다.

 

관찰결과 2 : std::cout과 << 연산자를 이용한 출력

출력을 위해서 다음과 같은 형태를 취해야지 출력이 되게 됩니다.

std::cout <<  "출력대상";

"출력대상"의 위치에는 무엇이든 올 수 있습니다. 정수와 실수를 비롯하여서 문자열, 변수가 올 수 있습니다.

C언어의 printf 함수와 달리 %d, %s와 같은 서식문자를 이용해서 별도의 출력포맷을 지정하지 않아도 데이터의 성격에 따라 적절한 출력이 이뤄집니다. 때문에 우의 출력방식은 C언어의 출력방식보다 편리합니다. 그러나 std::cout은 무엇인지, << 연산자는 어떠한 의미를 지니고 있는지, 그리고 출력할 대상의 자료형이 각양각샘임에도 불구하고 어떻게 적절히 출력이 이뤄지는지 궁금할 겁니다!

하지만 이 Pro 것을 완벽하기 이해하기 위해서는 어느 정도의 진도를 나가야만 합니다. 그때까지는 궁금해도 꾹 참고 기달려 주세요 ㅎㅎ

관찰결과 3 : << 연산자를 이용한 출력대상의 연이은 표현과 개행

<<도 사실 연산자입니다. 그리고 이 연산자를 이용하면 다음과 같이 둘 이상의 출력대상을 연이이어서 출력할 수 있습니다.

std::cout << "출력대상1" << "출력대상2" << "출력대상3";

앞서 소개한 예제에서 다음과 같은 형태로 출력을 요구하고 있습니다.

모두 << 연산자를 이용하여서 둘 이상의 데이터 출력을 명령합니다.

std::cout << "Hello " << "World!" << std::endl;
std::cout << num << ' ' << 'A';
std::cout << 3.14 << std::endl;

이 중에서 마지막 문장이 의미하는 건 아래와 같습니다.

"제일 먼저 공백 문자를 출력하고, 이어서 3.14를 출력하고 마지막으로 std::endl을 출력해라!"

공백과 3.14의 출력은 쉽게 이해할 수 있습니다. 그렇다면 std::endl의 출력이 의미하는 바는 무엇일까요?

혹시 관찰을 통해서 이미 파악하셨나요? 소스코드와 실행결과를 비교해보면 다음과 같은 사실을 아실 수 있습니다.

"<< 연산자를 이용한 std::endl의 출력은 개행으로 이어진다."

사실은 예제에서 std::endl을 지우고 다시 실행해봄으로써 보다 정확히 파악할 수 있습니다.

이렇게 하나의 예제를 통해서 기본적인 데이터의 출력방법을 알게 되었습니다. 그러나 의문점은 아직 많이많이 남아 있습니다.

우리는 아직도 std::cout와 << 연산자, 그리고 std::endl의 정체를 모릅니다. 다만 사용할 방법만 알고 있습니다.

scanf를 대신하는 데이터의 입력

키보드로부터의 데이터 입력에 대해서 이야기할 차례입니다. 예제를 통해서 ! 사용자로부터 두 개의 숫자를 입력 받고, 입력 받은 숫자의 덧셈 결과를 출력하는 예제입니다.

#include <iostream>

int main(void) {
    double val1;
    std::cout << "첫 번째 숫자입력: ";
    std::cin >> val1;

    double val2;
    std::cout << "두 번재 숫자입력: ";
    std::cin >> val2;

    double result = val1 + val2;
    std::cout << "덧셈 결과: " << result << std::endl;
    return 0;
}
  • 7행 : 정수를 입력받아서 val1에 저장
  • 11행 : 정수를 입력 받아서 val2에 저장

예제를 통해서 알 수 있는 특성을 정리해 보겠습니다.

  • 키보드로부터의 데이터 입력에도 헤더파일 선언문 #include<iostream>이 필요합니다.
  • 키보드로부터의 데이터 입력에는 std::cin과 >> 연산자가 사용됩니다.
  • 변수의 선언은 어디서든 가능합니다.

관찰결과 1 : 데이터의 입력에 사용되는 std::cin과 >> 연산자

키보드로부터의 데이터 입력을 위해서는 다음과 같은 형식을 취하면 됩니다.

std::cin >> "변수";

"변수"의 위치에는 키보드로부터 입력 받은 데이터를 저장할 변수의 이름이 오면 됩니다.

예제에서 7행에 삽입된 문장을 다시 봐 보겠습니다!

std::cin >> val1;

이는 키보드로부터 정수를 하나 입력 받아서 변수 val1에 저장하라는 의미입니다. 그렇다면 실수형 덧셈을 하고자 할 때, 위의 예제는 어떻게 바꿔야 할까요? 5, 9, 13행에 선언되어 있는 변수의 자료형을 double과 같은 실수형 변수로 선언하기만 하면 됩니다.

C++에서는 데이터의 입력도 데이터의 출력과 마찬가지로 별도의 포맷 지정이 필요 없기 때문이다. 즉, int형 변수가 오면 int형 데이터의 입력이, double형 변수가 오면 double형 데이터의 입력이 진행됩니다.

관찰결과 2 : C++의 지역변수 선언

C언어로 프로그램을 작성하는 경우에는 함수를 정의함에 있어서 지역변수의 선언이 항상 제일 먼저 등장해야만 했습니다.

그러나 C++의 지역변수 선언은 함수 내 어디든 삽입이 가능합니다. 그래서 위의 예제에서 9행과 13행의 변수선언은 유효합니다.

참고로 C언어도 새로운 표준에서는 C++과 마찬가지로 변수선언의 위치에 제한을 두지 않습니다. 그러나 아직도 대부분의 컴파일러는 이를 허용하지 않습니다. 반면 C++의 모든 컴파일러는 지역변수의 선언 위치에 제한을 두지 않습니다.

이와 관련하여서 예제를 하나 더 소개해 드리겠습니다. 다음 예제는 두 개의 정수를 입력 받아서 그 사이에 존재하는 정수들의 합을 계산하여 출력하는 프로그램 입니다. 예를 들어서 3과 7을 입력 받으면 그 사이에 존재하는 정수들(4, 5, 6)의 합을 계산해서 출력합니다.

#include <iostream>

int main(void) {
    int val1, val2;
    int result = 0;
    std::cout << "두 개의 숫자를 입력: ";
    std::cin >> val1 >> val2;

    if (val1 < val2) {
        for (int i = val1+1; i<val2; i++) {
            result += i;
        }
    } else {
        for (int i = val2+1; i<val1; i++) {
            result += i;
        }
    }

    std::cout << "두 수 사이의 정수 합: "<< result<< std::endl;
    return 0;
}
  • 8행 : 두 개의 정수를 입력 받아서 val1, val2에 순서대로 저장할 것을 명령하는 문장
  • 12, 17행 : 이 두 문장에서 보이듯이 for문 내에서 변수를 선언할 수 있습니다.

위 예제을 통해서 다음의 구조로 연속적인 데이터의 입력을 요구할 수 있다는 사실도 알 수 있습니다.

std::cin >> "변수1" >> "변수2";

첫 번째 입력되는 정수가 '변수1'에 저장되고, 두 번째 입력되는 정수가 "변수2"에 저장됩니다.

그리고 첫 번째 정수와 두 번째 정수의 경계는(데이터간 경계는) 탭, 스페이스 바, Enter 키의 입력과 같은 공백에 의해 나눠집니다.

이어서 12행과 17행을 통해서 for문의 초기화 문장 내에서 변수 선언이 가능함도 알 수 있습니다.

떄문에 다음과 같은 코드는 

int num;
for(num=0; num<10; num+=){...}

다음과 같이 한 줄로 선언 가능합니다.

for(num=0; num<10; num+=){...}

배열 기반의 문자열 입출력

마지막으로 배열 기반의 문자열 입출력 예제를 소개하겠습니다. 이 예제는 앞서 소개한 예제들과 크게 다르지 않습니다.

다만 입출력의 대상이 문자열이라는 차이만 있을 뿐입니다.

#include <iostream>

int main(void) {
    char name[200];
    char lang[200];

    std::cout << "이름은 무엇입니까? ";
    std::cin >> name;

    std::cout << "좋아하는 프로그래밍 언어는 무엇인가요? ";
    std::cin >> lang;

    std::cout << "내 이름은"  << name << "입니다.\n";
    std::cout << "제일 좋아하는 언어는 " << lang << "입니다." <<std::endl;
    return 0;
}
  • 9, 12행 : 배열에 문자열의 저장을 명령하고 있다.
  • 14행 : '\n'과 같은 특수문자는 C언어에서와 같은 의미를 지닙니다, 다만 std::endl로 개행의 역할을 대신할 뿐입니다.

'C++' 카테고리의 다른 글

01-2 함수 오버로딩(Function Overloading)  (0) 2020.11.21
01-1. printf와 scanf를 대신하는 입출력 방식  (0) 2020.11.18
댓글
댓글쓰기 폼