본문 바로가기
Programming/C++

C++ 언어 기초 (1) - 개념, 빌드(build), 명칭공간(namespace)

by 롱일스 2020. 8. 26.
반응형

▣ C++ 언어란?

  ▷ 1979년 Bell 연구소의 Bjarne Stroustrup이 C언어를 확장하여 만든 프로그래밍 언어이다.

  ▶ 1983년부터 C++이라는 이름을 사용했다.

  ▷ C언어와의 차이점?
     →  객체지향 프로그래밍 언어로, 클래스, 상속, 다형성, 동적 바인딩 등의 기능이 추가되었다.
     →  일반화 프로그래밍 기능인 템플릿 기능이 추가되었다.
     →  예외처리 기능이 추가되었다.

 

▣ C++ 프로그램의 작성과 빌드

   ●  C++ 소스 프로그램 파일

 

      ▷ 처리하고자 하는 작업을 수행하는 C++ 프로그램 명령어들을 담고 있는 파일이다.

      ▶ 파일의 확장자로는 '.cpp', '.cxx', '.C' 등을 사용한다.

 

   ●  C++ 헤더파일

      ▷ 클래스, 함수의 원형, 매크로, 전역변수, 상수 등 여러 소스 파일에 공통적으로 선언되는 내용을 담고 있는 파일을 가리킨다.

      ▶ 단독으로 컴파일되지 않고, #include라는 선행처리기 지시어에 의해 소스 프로그램 파일에 삽입되어 함께 컴파일된다.

      ▷ 확장자로는 일반적으로 '.h'를 사용한다.

 

   ●  C++ 프로그램 빌드

 

  ▷빌드의 과정

  1. 소스 프로그램 파일 생성(.cpp, .h, ...)
  2. 선행처리기(전처리기)로 소스 프로그램 파일을 가공한다. (헤더 파일을 합쳐주는 역할 등)
  3. 컴파일러로 어셈블리 파일(.s)로 번역해준다.
  4. 어셈블러로 컴퓨터가 이해할 수 있는 목적파일(.obj)로 번역해준다.
  5. 라이브러리와 목적파일(.obj)들을 연결하는 링크 과정을 거친다. 링커가 이 기능을 수행한다.
  6. 실행 프로그램 파일(.exe) 완성!

  ▷빌드를 위해 필요한 도구

  • 소스 프로그램 및 GUI 등의 편집기
  • 컴파일러
  • 링커
  • 디버깅 도구; 빌드 과정에서 생긴 오류 수정을 도와주는 도구

     --> 통합개발환경 IDE: DEV C++, Visual Studio, Eclipse, Code Blocks.

  ▷선행처리란?

  • C++ 프로그램을 컴파일하기 전에 소스 프로그램을 가공하여 컴파일러가 실제로 번역할 소스 프로그램을 만드는 것이다.
  • 선행처리기 지시어(preprocessor directives)로 처리 지시한다.
  • 선행처리기 지시어는 '#'으로 시작한다.
  • 선행처리기 지시어 문장은 한 행에 한 개의 문장을 작성한다.

  ▷대표적인 선행처리

  • 헤더파일 삽입: #include
  • 매크로 선언 및 해제: #define, #undef
  • 조건부 컴파일: #if, #ifdef, #ifndef

 

   ▷선행처리의 예 - 1

  a.cpp 파일이 아래와 같고

#include "a.h"
문장_1;
문장_2;
문장_3;
......

a.h 헤더파일이 아래와 같을 경우

문장_h1;
문장_h2;
문장_h3;

선행처리 결과 파일은 아래와 같다.

문장_h1;
문장_h2;
문장_h3;
문장_1;
문장_2;
문장_3;
.......

a.h 헤더파일의 경로를 #include를 통해 직접 적용한 경우이다.

   ▷선행처리의 예 -2

#include <iostream>

int main()
{
    std::cout << "안녕하세요. 공부하는짱구입니다." << std::endl;
    return 0;
}

< > 를 사용하여 표준라이브러리 폴더위치 중 include path에서  iostream을 추가하는 경우다.

 

 

▣ C++ 프로그램의 문법

●  명칭공간이란?

  ▷특정한 이름들이 인식되는 프로그램의 부분을 가리킨다.

  ▶동일한 명칭이라도 서로 다른 명칭공간에서 정의되면 별개의 것으로 구분한다. 즉, 여러 프로그래머가 작성한 프로그램을 결합하여 완성된 프로그램을 만들 경우 각자 필요한 명칭을 독립적으로 만들어 사용할 수 있다.

  ▷전역 명칭공간: 특정 명칭공간에 속하지 않는 기본 명칭공간을 가리킨다.

  ▶std 명칭공간: 표준 C++ 라이브러리의 명칭들이 정의되어 있는 명칭공간을 가리킨다.

  ▷명칭공간 예시

#include <iostream>

namespace BTS1 {int n = 10;}
namespace BTS2 {int n = 20;}
int n = 30; //전역명칭공간

int main()
{
    int n = 40; 
    std::cout << BTS1::n << std::endl;
    std::cout << BTS2::n << std::endl;
    std::cout << ::n << std::endl;
    std::cout << n << std::endl;

    return 0;
}

출력 결과는 다음과 같다.

::n은 전역명칭공간에서 정의된 n을 가리키므로 30이 된다.

#include <iostream>

namespace BTS1 {int n = 10;}
namespace BTS2 {int n = 20;}
int n = 30; //전역명칭공간

int main()
{
    //int n = 40; 
    std::cout << BTS1::n << std::endl;
    std::cout << BTS2::n << std::endl;
    std::cout << ::n << std::endl;
    std::cout << n << std::endl;

    return 0;
}

위와 같이 main 함수 내의 int n = 40;을 주석처리하면 아래와 같이 출력된다.

#include <iostream>

namespace BTS1 {int n = 10;}
namespace BTS2 {int n = 20;}
//int n = 30; //전역명칭공간

int main()
{
    int n = 40; 
    std::cout << BTS1::n << std::endl;
    std::cout << BTS2::n << std::endl;
    std::cout << ::n << std::endl;
    std::cout << n << std::endl;

    return 0;
}

만약에 전역명칭공간에서 정의된 int n = 30;을 주석처리하면, 컴파일 오류가 발생한다.

  ▶특정 명칭공간이나 명칭공간 내의 특정 이름을 자주 사용하는 경우에는 'using'을 이용해서 명칭공간 지정을 간소화 할 수 있다.

  ▷'using'을이 이용한 명칭공간 사용의 예

  아래 코드와 같이 std::cout 에서 cout으로 간소화가 가능하다.

#include <iostream>
using namespace std;
namespace BTS1 {int n = 10;}
namespace BTS2 {int n = 20;}
int n = 30;

int main()
{
    int n = 40;
    cout << BTS1::n << endl;
    cout << BTS2::n << endl;
    cout << ::n << endl;
    cout << n << endl;

    return 0;
}

 

728x90
반응형