이번 포스팅에서는 C++의 기본적인 프로그램 구성과, 키보드 입출력에 대해서 알아보자.
#include <iostream>
using namespace std;
int main(int argc, char const* argv[]) { // main 함수
int N;
cin >> N;
for (int i = 1; i <= N; i++) { // 반복문 코드
cout << i << "\n";
}
}
이를 보면 기본적인 C++ 프로그램의 구조를 알 수 있다.
main 함수는 C++ 프로그램의 실행 부분으로, C++ 프로젝트 내부에는 오직 하나만의 main 함수가 존재해야 한다. main 함수를 종료하면 프로그램이 종료된다.
main 함수의 리턴 타입은 C++ 표준에 의해서 int 타입으로 고정되어 있다. void 타입으로 작성하는 코드들도 있지만, 이는 C++ 표준이 아니다. 특정 컴파일러에 따라서 void main() 함수는 해석되지 않을 수 있다.
그리고 int main() 함수는 정수(int)를 return문을 가지고 있는데, main() 함수만 예외적으로 이 return 문을 생략할 수 있다. 보통 다음과 같은 return 문이 사용된다.
return 0;
main 함수의 return 문은 (보통의 경우) 운영 체제로 응용 프로그램이 종료되었다는 것을 알리기 위해서 사용되며, return 0이 아니라 다른 정수를 사용해도 상관이 없다. 숫자에 특별한 의미가 있는 것은 아니기 때문이다.
이는 헤더 파일을 불러오라는, 전처리기에 대한 지시문이며, 자세한 내용은 이전 포스팅과 컴파일러 포스팅을 참조하면 된다. 여기서 불러오고 있는 헤더 파일인 iostream은 C++ 표준 입출력을 위한 클래스와 객체가 선언되어 있다. 예를 들어, cout과 cin, <<, >> 연산자 모두 iostream을 필요로 한다.
C++에서는 표준 화면 출력으로 cout과 << 연산자를 이용한다.
std::cout<<"hello, world!"<<endl;
cout 객체
cout은 C++ 표준 출력 스트림 객체(standard output stream object)이다. C++ 프로그램에서 출력한 데이터를 자신과 연결된 스크린에 대신 출력해주며, 표준 네임스페이스 std 내부에 작성되어 있다.
<< 연산자
스트림 삽입 연산자(steram inseration operator)이며, 오른쪽에 작성된 데이터를 왼쪽 스트림 객체에 삽입한다. 본래 " << "는 정수를 왼쪽으로 shift하는 비트 연산자이지만, iostream 헤더 파일에 재정의(overloading) 된 연산자로 사용되고 있다. 참고로 여러 데이터를 한번에 출력할 수도 있다.
std::cout<<"Hello"<<" "<<"World!"<<endl;
문자열 말고도, C++ 기본 자료형(data type)들도 마찬가지로 출력할 수 있다.
💡 cout을 사용할 때 줄바꿈을 하려면?
"\n"를 이용하거나, endl 조작자를 사용한다.std::cout<<"Hello\n"; std::cout<<"Hello"<<endl;
💡 \n과 endl의 차이는?
- \n은 cout 스트림 버퍼가 꽉 차거나, 강제 출력 지시가 있기 전까지는 기능하지 않는다. 위 2가지 경우에만 \n이 작동해서 줄바꿈을 실행한다.
- endl 조작자(manipulator)의 경우 iostream 헤더 파일에 선언되어 있는 함수이다. endl을 실행하게 되면, \n을 cout 스트림 버퍼에 강제 삽입한 후, 즉시 모든 데이터를 출력하도록 지시한다.
C++의 키 입력은 cin을 사용한다.
#include <iostream>
using namespace std;
int main(int argc, char const* argv[]) {
int A;
cin >> A; // 키보드 입력 받기
cout << A << endl; // 출력 하기
}
cin과 >> 연산자를 통해 사용자로부터 키보드 입력을 받는다. cout과 << 연산자와 마찬가지로 문자열을 포함해서 모든 자료형을 입력 받을 수 있다. 또한 여러 개의 값을 >> 연산자를 여럿 사용해서 입력받을 수도 있다.
💡 cin
cout과 거의 비슷하다. C++ 응용 프로그램과 키보드를 연결하는 표준 입력 스트림 객체(Standard Input Stream Object)이다.
💡 >> 연산자
<<와 마찬가지로 비트 연산자에서 재정의 된 스트림 추출 연산자(Stream Extraction Operator)이다. 왼쪽 객체로부터 데이터를 읽어 오른쪽 변수에 값을 삽입한다.
cin을 통해서 입력한 값들은 일차적으로 cin의 스트림 버퍼에 저장되며, 사용자로부터 Enter 키가 입력된 것을 확인하면, 입력이 종료되었다고 판단해서 >> 연산자를 작동해 변수에 값을 저장한다.
💡 참고
C언어나, 파이썬과 마찬가지로 C++은 프로그램 어디서나 변수 선언이 가능하다.
C++에서는 문자열을 2가지 방식으로 처리한다.
Null 문자(\0 혹은 0)으로 끝나는 char 배열로 정의되며, C언어에서 사용하는 방식을 그대로 C++에 적용한 것이다. 예시 코드를 보자.
char a[5]={'a','b','c','d','\0'};
이런 식으로 마지막에 \0이 들어가는 배열을 의미한다. 만약 \0이 들어가있지 않다면 그건 문자열이 아니라 단순한 문자 배열이다.
혹은 다음과 같이 쓸 수 있다.
char a[]="abcde"; // 자동으로 배열의 크기 6으로 할당되며, \0이 끝에 들어간다.
마지막에 null 문자를 추가하기 위해서 배열의 크기는 내가 넣고자 하는 문자수보다 최소 1 이상 커야 한다. 1보다 클 경우, 배열 메모리의 빈 원소들에는 다 null 문자로 자동 초기화 된다.
C++에서 C-스트링을 다루기 위해서는 cstring이나 string.h 헤더 파일을 include 해야한다.
#include <cstring>
or
#include <string.h>
C++ 표준은, 확장자를 가진 헤더 파일인 string.h가 아니라 cstring을 사용하도록 권고하고 있다.
이러한 C-스트링을 사용할 때 반드시 기억해야 하는 점은, (배열의 크기-1)만큼 문자열을 입력할 수 있다는 것이다. 만약 배열에 할당된 크기 이상으로 문자를 입력하게 된다면 runtime error가 발생하게 된다. 참고로 영어는 1바이트, 한글은 한 문자에 2바이트를 사용한다.
cin은 공백 문자(white space character)가 입력되면, 그 앞까지 입력된 문자들을 하나의 문자열로 인식하고, 만약 변수가 하나만 존재할 경우 입력이 종료된 것으로 처리한다. 예를 들면 다음과 같다.
char a;
cin>>a;
cout>>a;
---
(Terminal)
안 녕 하 세 요
안
따라서 공백 문자를 포함해 문자열을 입력받고 싶다면, cin 객체에 포함되어 있는 getline 함수를 이용해서 공백을 포함한 문자열을 입력받을 수 있다. getline 함수의 원형은 다음과 같다.
istream& getline(char *buffer, streamsize num, char delim='\n');
buffer : 입력된 문자열이 저장될 char 배열
num : 입력받을 최대 문자의 수, 최대 num-1개까지 문자를 읽고, 마지막에 null 문자를 추가한다.
delim : 입력을 종료할 구분자 문자로, 기본값은 개행 문자이다.
cin.getline()을 호출하면 구분 문자가 입력될 때까지 공백문자를 포함해서 입력을 받을 수 있다. 사용하는 예시 코드는 다음과 같다.
#include<iostrema>
using namespace std;
int main(){
char address[100];
cin.getline(address, 100, '\n');
}
위 코드는 최대 99개의 문자를 입력받을 수 있다.
C-스트링 말고도, C++ 표준 라이브러리에서 제공하는 string 클래스를 통해서 문자열을 다룰 수 있다. string 클래스는 파이썬 등지에서 사용하는 string과 마찬가지로, 문자열의 크기에 제약이 없으며, 문자열을 다루기 쉽다. string 클래스에 대해서는 추후에 더 자세하게 다뤄보도록 하겠다(아직 클래스와 객체에 대해서 공부하지 않았으므로!!).