devseop08 님의 블로그

[Basic] C++ 프로그램 작성 및 빌드 본문

Language/C++

[Basic] C++ 프로그램 작성 및 빌드

devseop08 2025. 6. 5. 14:38

C++ 프로그램 빌드

  • 컴파일 : 소스 파일을 컴퓨터가 이해할 수 있는 명령으로 번역하는 과정
  • 목적 파일: 컴파일러가 하나의 번역 단위를 컴파일한 결과 만들어진 목적 코드를 저장하는 파일
  • 라이브러리: 프로그램을 작성할 때 사용할 수 있는 클래스나 값, 함수 등을 모아놓은 것
  • 링크 : 목적 파일과 라이브러리를 연결하여 실행 파일을 만드는 작업
  • 컴파일과 링크를 통해 실행 파일을 만드는 전 과정 통틀어 프로젝트 빌드란 한다.

C++ 프로그램 기본 구조

#include <iostream>

int main(){

    // 표준 출력 스트림으로 문장을 출력
    std::cout << "나의 첫 번째 C++ 프로그램" << std::endl;
    return 0;
}
  • 전처리 지시문
    • C++ 소스 프로그램은 컴파일 되기 전에 먼저 전처리 과정을 거친다.
    • 전처리는 소스 프로그램을 가공하여 실제로 컴파일러가 번역할 소스 프로그램을 만드는 과정으로, 전처리기가 이 작업을 수행한다.
    • 전처리기 지시어: 전처리기가 어떤 작업을 할 것인가를 지시하는 명령
    • 전처리기 지시어는 '#'으로 시작하며, 한 행에 한 문장씩 작성한다.
    • 다양한 전처리기 지시어
      • 헤더 파일을 소스 프로그램에 결합(#include)
      • 매크로 선언 및 해제(#define, #undef)
      • 조건부 컴파일(#if, #ifdef, #ifndef)
    • #include 지시어 사용 형식
      • #include < header > : 표준 include 경로에 존재하는 파일
      • #include "header" : 현재 위치에 존재하는 파일
    • 전처리기 지시어는 한 행에 한 문장씩 작성하며, 전처리기 지시어가 사용된 문장을 전처리 지시문이라 한다.
    • 헤더 파일
      • 간단한 프로그램이라면 하나의 소스 프로그램 파일에 프로그램을 완성할 수도 있지만 프로그램의 규모가 커지거나 여러 프로그래머가 프로그램을 분담하여 작성할 경우에는 여러 개의 소스 프로그램 파일에 나누어 프로그램을 작성하게 된다.
      • 여러 개의 소스 프로그램 파일에 나누어 프로그램을 작성하게 되면, 여러 소스 프로그램 파일에 공통적으로 사용되는 부분이 발생하게 되는데, 각각의 소스 프로그램 파일에 중복하여 작성하면 프로그램 관리가 어려워지고 오류가 발생하기 쉽다.
      • C++ 헤더 파일은 이러한 어려움을 개선하기 위해 여러 소스 프로그램 파일에 공통적으로 사용되는 부분을 별도로 작성한 것으로, 보통 '.h'라는 확장자를 사용한다.
      • 헤더 파일 작성
        // add.cpp
        int add(int x, int y){
          return x + y;
        }
        // main.cpp
        
        #include <iostream>
        #include "add.h" // add.h 헤더파일 포함
        
        int main()
        {
          std::cout << "The sum of 3 and 4 is " << add(3,4) << endl
        }
      • // add.h 헤더 파일 // 헤더 가드의 시작 #ifndef ADD_H #define ADD_H // .h 파일의 실제 내용: 선언 int add(int x, int y) // add 함수의 원형(function prototype) // 헤더 가드의 끝 #endif
    • 헤더 가드
      • 중복 정의 문제
        • 식별자는 하나의 정의만 가질 수 있기 때문에 동일한 변수 식별자를 두 번 이상 선언 및 정의하는 것은 불가하다.
        • 함수 또한 동일한 함수명(식별자)으로 두 번 이상 정의할 수 없다.
        • 또한 하나의 프로그램 파일에 동일한 헤더 파일이 두 번 이상 포함되는 경우도 불가하다.
          // geometry.h
          #include "math.h"
          // main.cpp
          #include "math.h"
          #include "geometry.h"
          
          int main(){
            return 0;
          }
          • 위의 프로그램은 math.h 헤더 파일이 중복되어 포함됐기 때문에 컴파일이 불가하다.
        • // math.h int num() { return 10; }
        • 헤더파일 중복 가능성 문제를 방지하기 위해 헤더 가드를 사용한다.
          • 헤더 가드 형식
          #ifndef SOME_UNIQUE_NAME_HERE // 해당 헤더 파일 이름이 이미 정의됐나 확인
          #define SOME_UNIQUE_NAME_HERE // 정의가 안 됐다면 해당 헤더 파일 이름 정의
        
          // 선언과 정의
        
          #endif
        • 헤더 가드 사용
        // math.h
        #ifndef MATH_H
        #define MATH_H
        
        int num()
        {
            return 10;
        }
        
        #endif
        
      • pragma once
        • 최신 컴파일러는 #pragma 지시자를 이용하여 단순한 헤더 가드를 지원한다.
        • #pragma once // code
  • namespace
    • 명칭공간(namespace)이란 특정한 이름들이 인식되는 프로그램의 부분을 의미한다.
    • C++에서 하나의 명칭은 한 번만 정의되어야 한다. 그런데 여러 프로그래머가 작성한 프로그램들을 묶어 하나의 프로그램을 만들 경우 같은 이름을 중복하여 정의할 우려가 있기 때문에 이러한 문제를 해소하기 위해 도입된 것이 명칭공간, 즉 namespace 개념이다.
    • #include <iostream> namespace NameSpace1 { int a = 10; } namespace NameSpace2 { int a = 20; } int a = 30; namespace NameSpace1 { int b = 50; } int main(){ int a = 40; std::cout << NameSpace1::a << std::endl; // 10 std::cout << NameSpace2::a << std::endl; // 20 std::cout << ::a << std::endl; // 30 std::cout << a << std::endl; // 40 std::cout << NameSpace1::b << std::endl; // 50 return 0; }
    • 명칭공간 내에 정의된 이름을 그 영역의 밖에서 사용할 때는 영역식별 연산자(::)로 소속된 명칭공간을 지정해야 한다.
    • 특정 명칭 공간에 속하지 않는 영역은 프로그램 전체의 영역인 전역 명칭공간에 해당된다.
    • 영역식별 연산자(::) 앞에 명칭 공간 이름이 없으면 전역 명칭 공간에서 영역 식별 연산자의 피연산자에 해당하는 식별자의 데이터를 찾는다.
    • 특정 명칭 공간에 정의된 이름을 자주 사용할 경우 매번 명칭공간을 지정하는 것이 번거로울 수 있는데, 이런 경우 using 구문을 사용하면 편리하다.
    • using 구문 형식
    • using namespace namespace-name; // 해당 명칭공간에 정의된 모든 식별자 using using namespace-name::name; // 해당 명칭공간에 정의된 특정 식별자 using
    • using 구문 사용또는
      cout << NameSpace1::a << endl;
      cout << NameSpace2::a << endl;
      cout << ::a << endl;
      cout << a << endl;
      cout << NameSpace1::b << endl;
    • using std::cout; using std::endl;
    • using namespace std;
  • 입출력 스트림
    • C++의 iostream 표준 라이브러리를 통해 문자 형태의 입출력을 할 수 있다.
    • 스트림은 일련의 데이터 열을 의미한다.
    • 표준 출력 스트림 cout은 콘솔 화면에 출력하는 기능을, cin은 키보드를 통해 입력하는 기능을 제공한다.
    • cout으로 데이터를 출력할 때는 삽입 연산자 '<<'를 사용한다.
    • 삽입 연산자 '<<'는 C++ 프로그램에서 오버로딩된 연산자다.
    • std::cout << value
    • 스트림 입력은 cin에 추출 연산자 '>>'를 사용한다.
    • 추출 연산자 '>>' 또한 C++ 프로그램에서 오버로딩된 연산자다.
    • std::cin >> value
  • 문장
    • C++ 프로그램은 여러 개의 문장으로 구성된다.
    • 하나의 문장은 키워드, 식별자, 연산자, 숫자, 문자, 문자열, 문장 부호, 빈칸 등을 문법에 따라 나열하여 작성한다.
    • 하나의 문장의 끝에는 세미콜론(;)을 기입하여 다음 문장과 구별
    • 하나의 문장은 한 행에 쓸 수도 있고, 여러 행에 걸쳐서 작성할 수도 있다.
    • 또한 한 행에 여러 개의 문장을 나열할 수도 있다.
    • 여러 개의 실행 문장을 '{'와 '}' 사이에 나열하여 묶을 수도 있다. 이러한 문장의 그룹을 블록이라고 부른다.
    • 블록은 여러 개의 문장을 묶어 하나의 문장처럼 취급하거나 함수의 몸체를 구성하기 위해 사용된다.
  • 함수
    • 함수는 C++ 프로그램의 가장 기본적인 구성 단위 중 하나
    • 함수는 반환할 데이터의 타입과 함수의 이름 등을 나타내는 함수 머리부(header)와 { } 사이에 나열된 문장들로 이루어진 몸체 블록으로 구성된다.
  • 주석
    • 주석은 프로그램 내에 설명문을 넣은 것
    • 주석 형식
// 주석
/*
    여러 행 주석
*/  

'Language > C++' 카테고리의 다른 글

[Basic] 상수와 리터럴  (0) 2025.07.07
[OOP] 생성자와 소멸자  (1) 2025.06.08
[Basic] 타입과 변수  (0) 2025.06.07
[OOP] 클래스 선언과 객체 정의  (0) 2025.06.06
[Basic] 배열, 포인터, 참조  (0) 2025.06.05