티스토리 뷰

C++

[C++] 헤더 파일과 네임스페이스

그레고리 2022. 2. 9. 22:37
728x90

시작하기 전에...

* 표준 라이브러리

: 특정언어의 표준 라이브러리 = 해당 언어의 개발 환경에 기본적으로 포함된 모든 기능들. 쉽게 생각해서 해당 언어로 구현된 모든 함수와 변수 등등은 다 표준 라이브러리에 포함되어있다. 

 

* 런타임 라이브러리

: 프로그램이 실행되기 위해 필요한 모듈들의 모음. 표준 라이브러리에서 필요한 것들을 모아놓은 것이라고 생각하면 편하다.

입출력, 메모리관리, 연산, 예외 처리 등 공통적으로 필요로 하는 기능들을 별도의 라이브러리 형태로 묶어서 제공하는 것

01.  헤더파일

.h 확장자를 가진 파일을 헤더 파일이라고 한다. 

헤더 파일에는 컴파일러와 함께 제공되는 헤더파일이 있고, 직접 작성한 헤더파일이 있을 수 있다. 

전자는 #include < filename> 으로 include 하고, 후자는 #include "filename" 으로 include 한다. 

#include <filename>
#include "filename"

전자는 C++  *런타임 라이브러리의 헤더파일로, 운영체제의 특별한 위치에 존재한다. 

후자는 전처리기(preprocesser)에게 디렉토리에서 .h 파일을 include하라고 지시한다. 

 

+ 객체 지향에선 클래스를 주로 헤더 파일안에 정의한다. 그리고 헤더파일이름은 클래스와 동일하게 한다. 

따라서 우리가 string 타입을 사용하기 위해서 <string> 헤더파일을 include 해야한다고 말하는 것은 해당 헤더파일에 정의되어있는 string 클래스를 사용하겠다는 말과 같다. 그리고 그 클래스 안에는 우리가 string타입에 사용 가능한 다양한 함수들이 들어있을 것이다.

02.  네임스페이스 

01. 네임스페이스란?

두개의 헤더파일에 같은 이름의 함수가 존재한다고 예를 들어보자. 

// a.h
void function(){ return 1; }

// b.h
void function(){ return 0; }

만약 .cpp파일에서 두 헤더를 모두 include하고, function 함수를 호출하면 .cpp파일은 어느 헤더의 function을 사용해야하는지 모른다. 이런 상황을 위해 네임스페이스(namespace)라는 개념을 도입한 것이다.

//a.h
// a라는 헤더파일 내의 a라는 네임스페이스 안에있는 function()함수
namespace a{
	int function(){return 0;}
}

//b.h
// b라는 헤더파일 내의 b라는 네임스페이스 안에있는 function()함수
namespace b{
	int function(){return 0;}
}

위와 같이 각 헤더파일에 namespace를 도입하면 .cpp 파일에서 두 헤더 파일을 모두 include 해도, function()함수를 호출할 때 namespace를 사용해서 어느 헤더의 function을 사용할 건지 정해줄 수 있다. 

 

02. 네임스페이스 내의 식별자 사용방법 (with. 스코프 분석 연산자)

어느 네임스페이스에서 식별자를 찾을 것인지는 :: (스코프 분석 연산자) 를 통해 정할 수 있다. 

[namespace name] :: [func or someting else inside the namespace]

아래는 a 네임스페이스 내의 function() 함수를 사용하는 코드이다.

 

// test.cpp
#include <iostream>
#include "a"
#include "b"

int main(){
	std::cout << a::function(); // std에 도 네임스페이스의 하나로 뒤에 설명하겠다. 
    return 0;
}

 

03. 중첩 네임스페이스

네임스페이스 안에 또 네임스페이스를 선언할 수 있다.

//head.h
namespace a{
	namespace b{
    	int function(){return 0;}
    }
    namespace c{
    	int function2(){return 0;}
    }
}

위 코드는 namespace a 안에 namespace b와 c를 선언하고있다. 

이 경우도 마찬가지로 .cpp 에서 namespace 를 사용할 때 :: 를 사용하면된다.

//test.cpp
#include <iostream>
#include "head.h"

int main(){
	std::cout << a::b::function(); // a안의 b를 사용한다.
    return 0;
}

 

04. std  네임스페이스

C++은 계속해서 업데이트를 하고있다. 여러 버전이 나왔고 앞으로도 업데이트 될 지도 모른다.

매번 새로운 버전이 나올 때 마다 C++의 표준 라이브러리들의 위치가 계속 변하면 사용하는데 어려움이 생길 것이다. 

이를 위해서 C++는 iostream.h 헤더파일 내의 std 라는 네임스페이스 안에 모든 표준 라이브러리의 모든 기능을 넣어놨다. 

//iostream.h
namespace std{
	// 모든 표준 라이브러리 기능들 
}

 

그래서 우리는 C++에서  cout, cin string, endl 등을 사용할 때 무조건 std::cin, std::cout, std::string 이런식으로 사용한다. 

std 네임스페이스의 경우, 우리가 표준라이브러리를 너무 많이 사용하기 때문에 아래와 같이 네임스페이스를 미리 선언하고 시작한다. 

using namespace [namespace name];
//test.cpp
#include <iostream>
using namespace std;

int main(){ // ... }

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함