▣ C++ 언어란?
▷ 1979년 Bell 연구소의 Bjarne Stroustrup이 C언어를 확장하여 만든 프로그래밍 언어이다.
▶ 1983년부터 C++이라는 이름을 사용했다.
▷ C언어와의 차이점?
→ 객체지향 프로그래밍 언어로, 클래스, 상속, 다형성, 동적 바인딩 등의 기능이 추가되었다.
→ 일반화 프로그래밍 기능인 템플릿 기능이 추가되었다.
→ 예외처리 기능이 추가되었다.
▣ C++ 프로그램의 작성과 빌드
● C++ 소스 프로그램 파일
▷ 처리하고자 하는 작업을 수행하는 C++ 프로그램 명령어들을 담고 있는 파일이다.
▶ 파일의 확장자로는 '.cpp', '.cxx', '.C' 등을 사용한다.
● C++ 헤더파일
▷ 클래스, 함수의 원형, 매크로, 전역변수, 상수 등 여러 소스 파일에 공통적으로 선언되는 내용을 담고 있는 파일을 가리킨다.
▶ 단독으로 컴파일되지 않고, #include라는 선행처리기 지시어에 의해 소스 프로그램 파일에 삽입되어 함께 컴파일된다.
▷ 확장자로는 일반적으로 '.h'를 사용한다.
● C++ 프로그램 빌드
▷빌드의 과정
- 소스 프로그램 파일 생성(.cpp, .h, ...)
- 선행처리기(전처리기)로 소스 프로그램 파일을 가공한다. (헤더 파일을 합쳐주는 역할 등)
- 컴파일러로 어셈블리 파일(.s)로 번역해준다.
- 어셈블러로 컴퓨터가 이해할 수 있는 목적파일(.obj)로 번역해준다.
- 라이브러리와 목적파일(.obj)들을 연결하는 링크 과정을 거친다. 링커가 이 기능을 수행한다.
- 실행 프로그램 파일(.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;
}
'Programming > C++' 카테고리의 다른 글
C++ 언어 기초 (6) - 클래스와 객체 (0) | 2020.08.27 |
---|---|
C++ 언어 기초 (5) - 함수 (0) | 2020.08.26 |
C++ 언어 기초 (4) - 포인터, 동적 메모리 할당, 참조 (0) | 2020.08.26 |
C++ 언어 기초 (3) - 구조체와 클래스 (0) | 2020.08.26 |
C++ 언어 기초 (2) - 키워드,식별자,자료형,변수,연산자,형변환 (0) | 2020.08.26 |