1. C++ 프로그램의 기본 요소와 화면 출력
main() 함수
- C++ 프로그램의 실행 시작점이므로 반드시 하나의 main() 함수가 존재해야 함
- C++ 표준에서 정한 main() 함수의 리턴 타입은 int
- ina main() 함수에 대해서만 예외적으로 return 문을 생략 가능
✅ main() 함수가 return한 정수 값은 누구에게 전달되는가?
부모 프로그램은 자식 프로그램의 main() 함수에서 리턴한 정수 값을 알아내는 함수를 통해, 자식 프로그램의 종료 상태를 알게 됨.
개발자가 부모/자식 프로그램을 따로 나눠놓지 않는 이상, 부모는 운영체제-자식은 응용프로그램으로 설정됨 -> 특별한 종료 관계가 없기 때문에 0이 아닌 다른 정수를 리턴한다고 해도 아무 의미 없음
#include <iostream>
- 전처리기(C++ Preprocessor)에 대한 지시문
- <iostream> 헤더파일에는 C++ 표준 입출력을 위한 클래스와 객체가 선언되어 있음 (Input/Output Stream)
화면에서 다음 줄로 넘어가기
std::cout << "Hello" << '\n';
std::cout << "Hello" << std::endl;
처리 방법 차이
1. '\n' 문자
- << 연산자가 '\n'문자를 cout 스트림 버퍼에 단순 삽입하고 끝
-> 그 후 cout 스트림 버퍼가 꽉 차거나 강제 출력 지시가 있는 경우, cout은 '\n'를 해석하여 그 다음 줄로 넘김
2. endl 조작자(manipulator)
- <iostream> 헤더 파일에 작성되어 있는 함수로 std::cout << "Hello" << std::endl; 코드 실행
-> << 연산자가 endl() 함수 호출
-> endl() 함수는 '\n'을 cout의 스트림 버퍼에 넣음
-> cout에게 현재 스트림 버퍼에 있는 데이터를 즉각 장치에 출력하도록 지시
=> 개행 실행과 동시에 cout의 스트림 버퍼에 있는 모든 데이터를 출력
스트림과 버퍼
- 스트림(stream)
- 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름 = 운영체제에 의해 생성되는 가상의 연결고리(중간 매개자) 역할

- 버퍼(buffer)
- 스트림 내부에 있는 임시 메모리 공간
- 입력된 문자를 한 번에 전달하므로, 전송 시간이 적게 걸려 성능 향상
- 문자를 잘못 입력한 경우 수정 가능

2. namespace와 std::
namespace(이름 공간)
- 이름 충돌이 발생할 때를 대비해 자신만의 고유한 이름 공간을 생성할 수 있도록 namespace 키워드 사용
- ::는 범위 지정 연산자
// 이름공간 생성
namespace kitae{ // kitae라는 이름 공간 생성
.......... // 선언되는 모든 이름은 kitae 이름 공간에 생성된 이름
}
// 이름공간 이용
이름공간(namespace) :: 이름(identifier)
std::
- 표준 이름 공간 : 모든 C++ 표준 라이브러리는 std 이름공간에 만들어져 있음
- std 이름 공간에 선언된 모든 이름에 대해 std::를 생락하고자 하면 namespace 키워드와 함께 using 지시어 사용
usnig namespace std;
3. 키보드로 문자열 입력
문자열은 C++의 기본 데이터 타입이 아니라서 다음 두 방법으로 문자열 표현
① C-스트링 : C 언어에서 문자열을 표현하는 방법
② string 클래스 : 문자열을 객체로 다루는 방법(권장)
① C-스트링
char name1[6] = {'G','r','a','c','e','\0'}; // 문자열 'Grace'
char name2[5] = {'G','r','a','c','e'}; // 단순 문자 배열
// 문자열 리터럴을 직접 배열에 저장하여 문자열 생성
char name3[6] = "Grace";
char name4[] = "Grace"; //배열의 크기는 6으로 자동 설정
- 널 문자('\0' 혹은 '0')로 끝나는 char 배열
- C++ 응용 프로그램은 C 라이브러리 함수들을 그대로 사용할 수 있음(<cstring>이나 <string.h> 헤더파일 include 함으로써)
- <cstring> 헤더파일은 내부적으로 <string.h>를 include하지만, C++ 표준에 따라 <cstring> include 하는 것이 바람직
cin을 이용한 문자열 입력
// name[] 배열에 문자열을 입력받는 코드
char name[6]; // 5개의 문자로 구성되는 문자열을 저장할 수 있는 char 배열
cin >> name; // 키보드에서 문자열을 읽어 name 배열에 저장
- name 배열의 크기가 6이기 때문에 5개 이하의 문자만 입력받을 수 있음(한글은 2개 이하)
✅ '>> 연산자'는 공백문자를 만나면 그 전까지 입력된 문자들을 하나의 문자열로 인식
cin.getline() : 공백이 포함된 문자열을 입력받기
cin 객체의 getline() 멤버 함수를 이용하면 공백이 포함된 문자열을 입력받을 수 있음
cin.getline(char buff[], int size, char delimitchat)
- buff : 키보드로부터 읽은 문자열을 저장할 배열
- size : buf[] 배열의 길이
- delimitchar : 문자열 입력 끝을 지정하는 구분 문자
- 최대 size-1개의 문자를 입력받거나 delimitchar로 지정된 문자를 만나면 문자열의 입력이 종료
- 입력된 문자열은 buf[]배열에 저장
- delimitChar로 지정된 문자는 저장되지 않고 cin 버퍼에서도 사라짐
- buf[ ] 배열에 널 문자('\0')가 덧붙여짐
- delimitChar의 디폴트 값 : '\n'이므로 생략 가능
② string 클래스
- C++ 표준 라이브러리에서 제공
- C-스트링은 배열의 크기에 의해 문자열의 크기가 고정, string 클래스는 문자열의 크기에 제한이 없고, 객체 지향적이고, 문자열을 다루기 쉬움(문자열 연산을 위한 멤버 함수와 연산자 제공)
#include <iostream>
#include <string> // string 클래스를 사용하기 위한 헤더 파일
using namespace std;
int main() {
string song("Falling in love with you"); // 문자열 song
string elvis("Elvis Presley"); // 문자열 elvis
string singer; // 문자열 singer
cout << song + "를 부른 가수는"; // + 로 문자열 연결
cout << "(힌트 : 첫글자는 " << elvis[0] << ")?"; // [] 연산자 사용
getline(cin, singer); // 문자열 입력
if(singer == elvis) // 문자열 비교
cout << "맞았습니다.";
else
cout << "틀렸습니다. "+ elvis + "입니다." << endl; // +로 문자열 연결
}
비교
#include <iostream>
#include <string> // string 클래스를 사용하기 위한 헤더 파일
using namespace std;
int main() {
// getline을 사용하여 문자열 입력 받기
string input;
cout << "문자열을 입력하세요. ";
getline(cin, input);
cout << "입력한 문자열" << input;
// cin.getline을 사용하여 문자열 입력 받기
char buffer[100];
cout << "문자열을 입력하세요. ";
cin.getline(buffer, 100);
cout << "입력한 문자열" << buffer;
}
4. #include <iostream>
#include <iostream>와 전처리기
- C++ 컴파일러는 컴파일 전에 전처리기(preprocessor) 실행시켜 #include문을 모두 처리
- #include문에 지정된 <헤더 파일>의 텍스트를 #include문이 있던 그 자리에 삽입
=> 이를 헤더 파일의 확장
이라고 함8u
- 모든 헤더 파일의 확장이 완료되면 전처리기 종료
- 전처리기가 종료되면 확장된 상태의 cpp파일이 컴파일 됨

헤더파일
- <iostream> 헤더파일은 컴파일러가 설치된 폴더의 include 폴더에 존재
- 표준 C++은 헤더파일에 확장자를 붙이지 않음!
헤더파일에는 무엇이 들어 있는가?
예를 들어 strcpy() 함수를 사용하려면
- <cstring>을 include 하는데, 그 이유는 strcpy() 함수의 코드가 들어있기 때문 (X)
- strcpy() 함수의 코드는 이미 컴파일된 기계어 형태로 C 라이브러리에 들어 있음
- <cstring> 헤더파일에는 strcpy() 함수의 선언만(원형) 들어 있으며, 컴파일할 때 strcpy() 함수의 호출이 정확한지 판단하는데 사용
#include <헤더파일> vs #include "헤더파일"
- #include <헤더파일>
- 컴파일러가 설치된 폴더에서 '헤더 파일'을 찾으라는 지시
- #include "헤더파일"
- 개발자의 프로젝트 폴더에서 '헤더 파일'을 찾으라는 지시
- 개발자 자신이 만든 헤더 파일을 사용하는 경우에 해당
해당 포스팅은 '황기태, 『명품 C++ Programming』, 생능출판사'를 참고하여 작성하였습니다.