The Cherno C++ - How C++ Works

Justin·2026년 3월 1일

The Cherno C++

목록 보기
2/2

C++ 동작 원리 학습 문서

개요

이 문서는 C++ 프로그램이 텍스트 형태의 소스 코드에서 실행 가능한 바이너리(Executable Binary) 파일로 변환되는 전체 과정을 설명합니다. C++의 빌드 과정은 크게 전처리, 컴파일, 링크의 단계로 나뉘며, 각 단계의 핵심 개념을 초보자도 이해할 수 있도록 명확하게 정리했습니다.


1. 프로그램의 시작점: main 함수 [01:39]

모든 C++ 프로그램은 main 함수를 가집니다. 이는 프로그램의 진입점(Entry Point)으로, 운영체제가 애플리케이션을 실행할 때 가장 먼저 코드를 읽고 실행하기 시작하는 부분입니다.

  • 컴퓨터는 main 함수 내부의 코드를 위에서부터 아래로 한 줄씩 순차적으로 실행합니다.
  • main 함수의 반환 타입은 정수형(int)이지만, 프로그래머가 명시적으로 값을 반환(return)하지 않아도 컴파일러가 자동으로 0을 반환하는 것으로 처리합니다. 이는 프로그램의 정상 종료를 의미하는 특별한 예외 규칙입니다.

2. 전처리기 (Pre-processor) [00:55]

컴파일러가 소스 코드를 기계어로 번역하기 직전에 수행되는 단계입니다.

  • # 기호로 시작하는 구문(예: #include)을 전처리기 지시문이라고 부릅니다.
  • 예를 들어 #include <iostream> 구문이 있다면, 전처리기는 iostream이라는 파일의 모든 내용을 찾아 복사한 뒤, 현재 파일의 해당 위치에 그대로 붙여넣습니다.

3. 연산자(Operator)와 함수 [02:54]

C++ 문법을 처음 접할 때 혼란스러울 수 있는 부분 중 하나는 꺾쇠 기호(<<)의 사용입니다.

  • std::cout << "Hello World"에서 사용되는 << 기호는 단순한 기호가 아니라 오버로딩된 연산자(Overloaded Operator)입니다.
  • C++에서 연산자는 근본적으로 함수와 동일하게 동작합니다. 즉, 위의 코드는 문자열 데이터를 콘솔 화면으로 밀어넣어 출력하도록 정의된 하나의 함수를 호출하는 것과 같습니다.

4. 컴파일 (Compilation) 과정 [08:20]

전처리기가 작업을 마친 후, 사람이 읽을 수 있는 C++ 코드를 컴퓨터가 이해할 수 있는 기계어(Machine Code)로 변환하는 과정입니다.

  • 개별 컴파일: 프로젝트 내의 모든 .cpp 파일은 각각 독립적으로 컴파일됩니다. 이때 헤더 파일은 직접 컴파일되지 않으며, 전처리기를 통해 .cpp 파일에 포함된 상태로만 처리됩니다.
  • 오브젝트 파일 생성: 각 .cpp 파일은 컴파일을 거쳐 각각 독립된 오브젝트 파일(.obj)로 변환됩니다.

5. 선언(Declaration)과 정의(Definition) [15:16]

코드를 여러 파일로 나누어 관리할 때 반드시 이해해야 하는 핵심 개념입니다.

  • 선언 (Declaration): 컴파일러에게 특정 이름의 함수나 변수가 존재함을 알려주는 역할만 합니다. 내부 로직(본문)은 작성하지 않으며, 이를 통해 다른 파일에 있는 함수를 호출할 때 컴파일 오류가 발생하지 않도록 컴파일러를 납득시킵니다.
  • 정의 (Definition): 해당 함수가 실제로 어떤 동작을 수행하는지 그 내부 로직(본문)을 작성하는 구역입니다.

6. 링커 (Linker)의 역할 [08:53]

컴파일러가 생성한 여러 개의 개별 오브젝트 파일(.obj)을 하나로 연결하여 최종적인 하나의 실행 파일(.exe)을 만드는 과정입니다.

  • 링커의 주된 목적은 분리된 파일들을 접착제처럼 연결(Wiring)하는 것입니다.
  • 만약 소스 코드에서 특정 함수를 '선언'하여 사용했으나, 프로젝트 전체를 뒤져봐도 그 함수의 실제 '정의'를 찾을 수 없다면 링커는 연결에 실패합니다. 이때 발생하는 오류가 바로 '확인되지 않은 외부 기호(Unresolved External Symbol)' 오류입니다.

7. 빌드 설정 (Build Configuration) [05:06]

개발 환경(예: Visual Studio)에서는 코드를 컴파일하고 빌드하는 규칙을 설정할 수 있습니다.

  • Debug 모드: 프로그램의 논리적 오류를 쉽게 추적할 수 있도록 최적화(Optimization) 기능이 비활성화됩니다. 실행 속도는 상대적으로 느리지만 개발 과정에서 반드시 필요합니다.
  • Release 모드: 최종 사용자에게 배포하기 위한 설정으로, 실행 속도와 성능을 극대화하기 위해 코드를 최적화합니다.

핵심 요약

위 본문에서 다룬 C++ 동작 원리의 중요한 핵심 개념은 다음과 같습니다.

  1. main 함수: C++ 프로그램이 실행을 시작하는 최초의 진입점.
  2. 전처리기: 실제 컴파일 이전에 # 지시문을 먼저 평가하여 필요한 파일의 내용을 복사 및 병합하는 작업 수행.
  3. 컴파일러: 각각의 .cpp 파일을 독립적으로 기계어로 번역하여 개별적인 .obj(오브젝트) 파일을 생성하는 도구.
  4. 선언과 정의: 선언은 대상의 존재 여부만 컴파일러에 알리는 것이고, 정의는 실제 동작 코드를 구현하는 것.
  5. 링커: 컴파일된 여러 개의 .obj 파일을 하나로 결합하여 단일 .exe(실행) 파일을 생성하고, 선언과 정의가 일치하도록 연결하는 도구.

[https://youtu.be/SfGuIVzE_Os?si=mo0ZYpj_gP-4trat]

profile
안녕하세요.

0개의 댓글