C++ 학습을 시작하려면 먼저 소스 코드를 작성하고 실행할 수 있는 개발 환경이 필요합니다.
이번 글에서는 Visual Studio 프로젝트의 기본 경로를 설정하고, 콘솔에 문자열을 출력하는 첫 번째 C++ 프로그램을 작성해 보겠습니다.
그리고 예제에 사용한 #include, main, std::cout, std::cin.get()이 각각 어떤 역할을 하는지도 함께 살펴보겠습니다.
목차
- 실습 환경
- 빌드 결과물과 중간 파일 경로 설정
- 첫 번째 C++ 프로그램
- #include의 역할
- main 함수
- std::cout과 << 연산자
- std::cin.get()의 역할
- 프로젝트 빌드 및 실행
- 정리
실습 환경
이번 글은 Windows 환경에서 Visual Studio를 사용하는 것을 기준으로 설명합니다.
Visual Studio Installer에서 C++를 사용한 데스크톱 개발 워크로드가 설치되어 있어야 합니다.
- 운영체제: Windows
- 개발 도구: Visual Studio
- 프로젝트 종류: C++ 콘솔 애플리케이션
Visual Studio에서 빈 C++ 콘솔 프로젝트를 생성한 뒤 프로젝트에 Main.cpp 파일을 추가합니다.
빌드 결과물과 중간 파일 경로 설정
프로젝트를 빌드하면 실행 파일뿐만 아니라 빌드 과정에서 사용하는 여러 중간 파일이 생성됩니다.
프로젝트 규모가 커지면 이러한 파일이 프로젝트 폴더 곳곳에 섞이지 않도록 경로를 구분해 두는 것이 좋습니다.
솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭한 뒤 속성 → 구성 속성 → 일반로 이동합니다.
출력 디렉터리
출력 디렉터리에는 .exe와 같은 최종 빌드 결과물이 생성됩니다.
$(SolutionDir)Bin\$(Platform)\$(Configuration)\$(ProjectName)\
중간 디렉터리
중간 디렉터리에는 .obj처럼 빌드 과정에서 만들어지는 중간 파일이 생성됩니다.
$(SolutionDir)Intermediate\$(Platform)\$(Configuration)\$(ProjectName)\
$(SolutionDir), $(ProjectName), $(Platform), $(Configuration)은 Visual Studio와 MSBuild가 제공하는 매크로입니다.
각 매크로는 현재 솔루션 경로, 프로젝트 이름, 플랫폼, 빌드 구성에 맞는 값으로 자동 변환됩니다.
주의: 프로젝트 속성 창 상단의 구성과 플랫폼을 확인해야 합니다. 같은 경로를 모든 환경에 적용하려면 각각 모든 구성과 모든 플랫폼을 선택한 뒤 설정합니다.
첫 번째 C++ 프로그램
Main.cpp 파일에 다음 코드를 작성합니다.
#include <iostream>
int main()
{
std::cout << "Hello World\n";
std::cin.get();
}
프로그램을 실행하면 콘솔에 다음 문자열이 출력됩니다.
Hello World
코드는 짧지만 C++ 프로그램의 기본적인 구성 요소를 포함하고 있습니다.
#include <iostream>: 콘솔 입출력에 필요한 기능을 포함합니다.main: 프로그램이 실행을 시작하는 함수입니다.std::cout: 콘솔에 값을 출력합니다.std::cin.get(): 표준 입력에서 문자 하나를 읽습니다.
#include의 역할
#include <iostream>
#include 지시문은 지정한 헤더 파일의 내용을 현재 소스 파일에 포함하도록 전처리기에 요청합니다.
iostream 헤더에는 std::cout과 std::cin처럼 표준 입출력에 필요한 선언이 들어 있습니다.
입문 단계에서는 헤더 파일의 내용이 #include가 작성된 위치에 들어오는 것처럼 이해할 수 있습니다. 조금 더 정확하게 말하면 전처리기가 헤더의 전처리 토큰을 현재 소스 파일에 포함해 처리합니다.
만약 iostream 헤더를 포함하지 않고 std::cout을 사용하면 컴파일러는 std::cout에 관한 선언을 확인할 수 없습니다.
main 함수
int main()
{
}
일반적인 C++ 콘솔 프로그램은 main 함수에서 실행을 시작합니다.
main 앞에 작성된 int는 이 함수가 정수 값을 반환한다는 의미입니다. main 함수가 0을 반환하면 프로그램이 정상적으로 종료되었다는 뜻입니다.
int main()
{
return 0;
}
C++에서는 main 함수에 한해 return 0;을 생략할 수 있습니다. 함수의 끝까지 실행되면 0을 반환한 것으로 처리됩니다.
std::cout과 << 연산자
std::cout << "Hello World\n";
std::cout은 콘솔 출력을 담당하는 표준 출력 스트림 객체입니다. 함수가 아니라 객체라는 점에 주의해야 합니다.
이 코드에서 <<는 스트림 삽입 연산자로 동작합니다. 오른쪽에 있는 값을 왼쪽의 출력 스트림으로 전달합니다.
<< 연산의 결과로 출력 스트림이 다시 반환되기 때문에 여러 값을 연속해서 출력할 수도 있습니다.
std::cout << "Hello " << "World" << '\n';
위 코드는 다음 순서로 동작합니다.
"Hello "를 출력합니다.- 반환된 출력 스트림에
"World"를 전달합니다. - 마지막으로 줄바꿈 문자
'\n'을 전달합니다.
std::cout.print()와 같은 함수가 연속으로 호출되는 것은 아닙니다.<<연산자가 값을 출력한 뒤 출력 스트림을 다시 반환하기 때문에 연속해서 사용할 수 있습니다.
std::cin.get()의 역할
std::cin.get();
std::cin은 표준 입력을 담당하는 스트림 객체입니다. get() 함수는 표준 입력에서 문자 하나를 읽습니다.
현재 예제에서는 실행 결과를 확인하기 전에 콘솔 창이 닫히는 것을 막기 위해 사용했습니다. 사용자가 키를 입력할 때까지 프로그램의 실행이 이 코드에서 대기합니다.
다만 std::cin.get()은 모든 C++ 프로그램에 반드시 필요한 코드는 아닙니다.
Visual Studio에서 디버그하지 않고 시작(Ctrl + F5)으로 실행하면 프로그램 종료 후 콘솔 창이 유지될 수 있으므로 실행 환경에 따라 생략할 수 있습니다.
프로젝트 빌드 및 실행
코드를 작성했다면 프로젝트를 빌드하고 실행합니다.
- Ctrl + B를 누르거나 빌드 → 프로젝트 빌드를 선택합니다.
- 출력 창에서 빌드 성공 여부를 확인합니다.
- Ctrl + F5를 눌러 디버그하지 않고 프로그램을 실행합니다.
- 콘솔에
Hello World가 출력되는지 확인합니다.
앞에서 출력 디렉터리를 설정했다면 다음과 같은 구조에서 생성된 실행 파일을 확인할 수 있습니다.
Bin
└─ x64
└─ Debug
└─ 프로젝트 이름
└─ 프로젝트 이름.exe
작성한 Main.cpp 파일이 곧바로 실행되는 것은 아닙니다. Visual Studio의 빌드 도구가 소스 코드를 컴퓨터에서 실행할 수 있는 실행 파일로 변환합니다.
이 과정에서 어떤 일이 일어나는지는 다음 글에서 자세히 살펴보겠습니다.
정리
- Visual Studio에서 C++를 사용하려면 C++를 사용한 데스크톱 개발 워크로드가 필요합니다.
- 출력 디렉터리에는
.exe와 같은 최종 빌드 결과물이 생성됩니다. - 중간 디렉터리에는
.obj와 같은 중간 파일이 생성됩니다. #include는 지정한 헤더의 내용을 현재 소스 파일에 포함하도록 전처리기에 요청합니다.- 일반적인 C++ 콘솔 프로그램은
main함수에서 실행을 시작합니다. std::cout은 콘솔 출력을 담당하는 표준 출력 스트림 객체입니다.<<연산자는 오른쪽의 값을 왼쪽 출력 스트림에 전달합니다.std::cin.get()은 문자 하나를 입력받으며, 이번 예제에서는 콘솔 창이 바로 닫히지 않도록 사용했습니다.main함수에서는return 0;을 생략할 수 있습니다.