Menu

C++ Hello World: 첫 프로그램을 한 줄씩 살펴보기

C++ Hello World 프로그램을 한 줄씩 설명합니다: #include <iostream>, int main(), std::cout과 <<, std::endl과 '\n'의 차이, return 0, 그리고 컴파일하는 방법과 초보자가 처음 만나는 오류를 고치는 법.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

프로그램

C++로 작성한 완전한 Hello World 프로그램입니다. Run을 누르면 브라우저에서 컴파일하고 실행합니다:

한 줄이 출력됩니다:

Hello, World!

코드는 다섯 줄이고, 각 줄이 저마다 정해진 일을 합니다. 아래 섹션에서는 이 줄들을 순서대로 살펴본 다음, 같은 파일을 여러분의 컴퓨터에서 빌드하는 방법과 처음 만나는 컴파일러 오류가 보통 무슨 뜻인지 다룹니다.

한 줄씩 살펴보기

#include <iostream>

#로 시작하는 줄은 전처리기에게 주는 지시입니다. 전처리기는 본격적인 컴파일보다 먼저 실행됩니다. #include <iostream>은 표준 헤더 <iostream>(입출력 스트림)의 선언을 그 자리에 붙여 넣습니다. std::cout과 std::endl이 선언된 곳이 바로 이 헤더입니다. C++에는 내장 출력문이 없습니다. 출력은 표준 라이브러리의 일부이고, 이 줄로 그 기능을 쓰겠다고 선택하는 것입니다.

int main() {

모든 C++ 프로그램은 main이라는 함수에서 실행을 시작합니다. main은 정확히 하나여야 하고, 소문자로 써야 합니다. 앞에 붙은 int는 main이 끝날 때 운영체제에 정수를 돌려준다는 뜻입니다. 빈 괄호는 여기서 인자를 받지 않는다는 뜻이고, 여는 중괄호 {가 함수 본문을 시작합니다.

std::cout << "Hello, World!" << std::endl;

실제로 출력을 하는 줄입니다.

  • std::cout은 표준 출력 스트림이고, 보통은 터미널입니다. std:: 접두사는 cout이 표준 라이브러리 전체가 들어 있는 std 네임스페이스에 있다는 뜻입니다.
  • <<는 삽입 연산자입니다. 오른쪽 값을 왼쪽 스트림으로 보냅니다. 이어서 쓸 수 있고, 각 <<가 다음 조각을 같은 출력에 덧붙입니다.
  • "Hello, World!"는 문자열 리터럴, 즉 큰따옴표로 감싼 텍스트입니다.
  • std::endl은 줄을 끝냅니다.
  • 세미콜론은 문장을 끝냅니다. C++의 모든 문장에는 세미콜론이 필요합니다.

return 0;

return은 main을 끝내고 운영체제에 값을 돌려줍니다. 관례상 0은 프로그램이 성공했다는 뜻이고, 다른 숫자는 오류를 알립니다. 스크립트와 빌드 도구가 이 종료 코드를 읽습니다. main 안에서는 이 줄을 생략할 수 있습니다. 실행이 닫는 중괄호에 도달하면 C++는 return 0;을 쓴 것처럼 동작합니다.

닫는 중괄호

닫는 중괄호가 main의 본문을 끝내고, 그와 함께 프로그램도 끝납니다.

std::endl vs '\n'

줄을 끝내는 흔한 방법은 두 가지이고, 실제 코드에는 둘 다 나옵니다:

출력:

Hello, World!
Hello again!
Line one
Line two

눈에 보이는 결과는 같습니다. 차이는 std::endl이 개행을 쓴 다음 스트림을 플러시해서, 버퍼에 쌓인 텍스트를 곧바로 터미널로 내보낸다는 점입니다. '\n'은 개행만 쓰고, 스트림은 자기 일정에 따라 플러시합니다(늦어도 프로그램이 끝날 때). 수천 줄을 출력하는 루프에서는 std::endl이 만드는 추가 플러시가 측정 가능한 차이를 만들기 때문에, 많은 C++ 프로그래머가 기본으로 '\n'을 쓰고 텍스트가 바로 나타나야 할 때만 std::endl을 씁니다. 세 번째 줄에서 보듯 \n 이스케이프는 문자열 안에서도 동작합니다. cout과 cin은 입력과 출력 페이지에서 더 깊이 다룹니다.

using namespace std; 버전

많은 튜토리얼이 Hello World를 이렇게 씁니다:

using namespace std;는 다른 곳에서 찾지 못한 이름을 std 네임스페이스에서 찾으라고 컴파일러에 알려 주기 때문에, cout과 endl이 접두사 없이 동작합니다. 작은 프로그램이나 연습 문제에서는 괜찮습니다. 규모가 큰 코드와 헤더 파일에서는 보통 피하는데, 표준 이름 수백 개를 스코프로 끌어와서 여러분이 만든 이름(예를 들어 직접 만든 count나 distance 함수)과 충돌할 수 있기 때문입니다. std::cout이라고 쓰면 다섯 글자가 늘어나는 대신 그 위험이 사라집니다.

내 컴퓨터에서 Hello World 컴파일하고 실행하기

브라우저 에디터는 컴파일을 대신 해 줍니다. 여러분의 컴퓨터에서는 같은 두 단계를 직접 합니다. 소스 파일을 실행 파일로 컴파일하고, 그 실행 파일을 실행합니다. 먼저 C++ 컴파일러가 설치되어 있어야 합니다. Windows, macOS, Linux에서 컴파일러를 준비하는 방법은 설치 가이드에서 다룹니다.

프로그램을 hello.cpp로 저장하고, 같은 폴더에서 터미널을 열어 컴파일하세요:

g++ hello.cpp -o hello

아무것도 출력되지 않았다면 성공한 것이고, 소스 파일 옆에 hello(Windows에서는 hello.exe)라는 실행 파일이 생겼습니다. 실행해 보세요:

./hello

Windows에서는 대신 hello.exe 또는 그냥 hello를 실행합니다. macOS에서는 clang++ hello.cpp -o hello도 똑같이 동작하고, 거기서 g++는 보통 이름만 다른 Clang입니다.

처음부터 추가해 둘 만한 플래그가 두 가지 있습니다. -std=c++17(또는 -std=c++20)은 언어 표준을 고르고, -Wall -Wextra는 실제 실수를 잡아내는 경고를 켭니다:

g++ -std=c++17 -Wall -Wextra hello.cpp -o hello

이 플래그들이 하는 일, -o의 뜻, 그리고 -o가 없으면 왜 a.out이라는 파일이 생기는지는 C++ 컴파일하기 페이지에서 설명합니다.

처음 만나는 흔한 오류

아래 오류 메시지는 GCC(g++)의 것입니다. Clang은 메시지 문구가 다르지만 같은 줄을 가리킵니다.

세미콜론 누락.

hello.cpp:5:5: error: expected ';' before 'return'

컴파일러는 다음 토큰에 도달해서야 ;가 빠졌다는 것을 알아채기 때문에, 줄 번호는 보통 실수한 곳의 한 줄 아래를 가리킵니다. 앞 줄의 끝을 확인하세요.

#include <iostream> 누락.

error: 'cout' is not a member of 'std'

std::cout은 <iostream>에 선언되어 있습니다. 파일 맨 위에 include를 추가하세요.

std:: 누락.

error: 'cout' was not declared in this scope; did you mean 'std::cout'?

std::cout과 std::endl로 쓰거나, include 다음에 using namespace std;를 추가하세요.

main 대신 Main. C++는 대소문자를 구분합니다. int Main()이 있는 프로그램은 컴파일은 되지만, 링크 단계에서 undefined reference to 'main'으로 실패합니다. 프로그램이 시작해야 할 함수를 링커가 찾지 못하기 때문입니다.

g++ 대신 gcc로 컴파일. gcc hello.cpp는 C++ 코드를 컴파일하지만 C++ 표준 라이브러리를 링크하지 않아서, undefined reference to std::... 오류가 길게 나옵니다. C++ 파일에는 g++(또는 clang++)를 쓰세요.

둥근 따옴표. 워드 프로세서나 웹 페이지에서 복사한 코드에는 곧은 따옴표("Hello") 대신 인쇄용 따옴표(“Hello”)가 들어 있을 수 있습니다. GCC는 stray '\342' in program이라고 보고합니다. 에디터에서 따옴표를 다시 입력하세요.

오래된 헤더와 void main. 아주 오래된 튜토리얼 중에는 #include <iostream.h>나 void main()을 쓰는 것이 있습니다. 둘 다 표준 C++가 아닙니다. 헤더는 .h 없는 <iostream>이고, main은 int를 반환해야 합니다. 최신 컴파일러는 둘 다 거부합니다.

C++23의 std::println으로 출력하기

C++23에는 한 줄을 출력하는 더 짧은 방법인 <print> 헤더의 std::println이 추가되었습니다:

#include <print>

int main() {
    std::println("Hello, World!");
}

개행을 알아서 붙여 주고, 값을 넣을 {} 자리 표시자를 지원합니다. GCC 14, libc++를 쓰는 Clang 18, 최신 Visual Studio에서 지원되며 -std=c++23이 필요합니다. 기존 코드와 튜토리얼 대부분은 여전히 std::cout을 쓰므로, 둘 다 능숙하게 다룰 줄 알아 두면 좋습니다.

자주 묻는 질문

C++에서 Hello World는 어떻게 작성하나요?

#include <iostream>으로 시작하고, int main()을 정의한 뒤 그 안에 std::cout << "Hello, World!" << std::endl;을 넣고 이어서 return 0;을 씁니다. 파일을 hello.cpp로 저장하고 g++ hello.cpp -o hello로 컴파일한 다음 ./hello를 실행하세요.

C++ Hello World에는 왜 #include <iostream>이 필요한가요?

std::cout과 std::endl은 언어에 내장된 것이 아니라 <iostream> 헤더에 선언되어 있습니다. include가 없으면 컴파일러는 이 이름들을 모르기 때문에 'cout' is not a member of 'std' 같은 오류를 내고 멈춥니다.

std::endl과 '\n'의 차이는 무엇인가요?

둘 다 줄을 끝냅니다. std::endl은 여기에 더해 출력 버퍼를 플러시해서 텍스트를 즉시 내보냅니다. '\n'은 개행만 쓰고 플러시는 스트림이 준비됐을 때 하도록 두기 때문에, 여러 줄을 출력할 때 더 빠릅니다. Hello World 한 줄에서는 눈에 보이는 차이가 없습니다.

C++에서 main 끝에 return 0이 꼭 필요한가요?

아니요. main은 C++가 return을 생략하도록 허용하는 유일한 함수입니다. 닫는 중괄호에 도달하면 return 0;으로 취급되고, 이는 운영체제에 프로그램이 성공했다고 알립니다. 종료 상태를 명시하려고 그래도 쓰는 사람이 많습니다.

Coddy 프로그래밍 언어 일러스트

Coddy로 코딩 배우기

시작하기