[C++] 네임스페이스(namespace)와 std, 그리고 헤더 파일(header file)

HY K·2024년 8월 21일

오늘 이번 포스팅에서는, C++의 네임스페이스(namespace)와 std, 그리고 헤더 파일에 대해서 알아보자.


1. 네임스페이스(namespace)

C++ 프로그램을 작성하다보면, 식별자(혹은 이름, identifier)가 충돌하는 경우가 종종 발생한다. 이 같은 경우 컴파일러에서 컴파일 과정을 진행하거나, 링킹을 하는 동안 이름이 겹치는 함수나 변수 중 어떤 함수나 변수를 호출하는지 이해하지 못하게 되어서, 제대로 컴파일 혹은 링킹 과정이 진행되지 않는다.

이를 방지하기 위해 C++03 표준에서는 변수, 함수, 클래스(class) 등의 이름이 충돌하는 것을 막지 않도록, 고유한 네임스페이스를 선언할 수 있도록 키워드를 도입하였다. 네임스페이스를 선언하고, 그 안에 변수나 함수를 집어넣게 되면 다른 네임스페이스 내부의 동명의 변수나 함수와 구분되는, 고유한 이름이 부여된다.

네임스페이스를 선언하는 방법은 다음과 같다.

namespace abc {
...
name
...
}

C++에서는 namespace 키워드를 통해서 선언한다.
그리고 네임스페이스 내부에 선언된 변수나 함수를 사용하기 위해서는, "::" 기호를 통해서 사용할 수 있다.

abc::name

::는 C++의 범위 지정 연산자이다.

2. std

std는 C++03에서 지정한 표준 네임스페이스(standard namespace)로, 모든 C++ 표준 라이브러리는 std 네임스페이스 내부에 작성되어 있다. 따라서 C++ 표준 라이브러리에 선언된 변수, 함수 등의 이름을 사용할 때는 반드시 std::를 접두어로 붙여야 한다.

예를 들어서, C++의 표준 입출력인 cin과 cout은 std를 함께 사용해야 한다.

std::cout<<"Hello, World!"<<endl;

하지만 이 모든 명령어에 std를 일일히 붙이는 것은 번거로우므로, std를 생략할 수 있도록 설계가 되어있다. C++ 초급 예제 코드를 보면 반드시 보이는 구문이 있다.

using namespace std;

이렇게 선언하게 되면 std 네임스페이스 내부에 선언된 모든 이름들에 대해서 std 키워드를 생략할 수 있다.

만약 C++의 "iostream" 헤더 파일 내에 선언된 모든 클래스, 함수, 변수들을 사용할 때 std를 생략하기 위해서는 다음과 같이 작성하면 된다.

#include <iostream>
using namespace std;

헤더 파일(Header File)

헤더 파일은 C++ 코드에서,

#include <iostream>
#include <stdio.h>
#include "ros/ros.h"

이와 같이 #include 문에 의해서 불려지는 파일이다.

C++ 코드의 컴파일 과정을 살펴보게 된다면(이에 대해서 자세히 알고 싶다면, https://velog.io/@hy_k/%EB%A6%AC%EB%88%85%EC%8A%A4linux-%EB%B9%8C%EB%93%9C-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%ED%95%B4 참고),

전처리기(pre-processor)가 컴파일 전에 #include 문을 모두 처리하게 된다. 전처리기는 include 문에 지정되어 있는 헤더 파일의 텍스트를 include 문 대신에 삽입하게 된다. 만약 헤더 파일 내부에 다른 헤더 파일을 include한다면, 그것 또한 불러오게 된다.

iostream 헤더 파일은?

iostream 헤더 파일은 텍스트 파일로써, C++ 컴파일러가 설치된 폴더의 include 폴더 내부에 존재한다.

헤더 파일의 확장자는?

C언어에서 헤더 파일의 확장자는 .h를 사용한다. 하지만 C++에서는 C++03 이후로 헤더 파일에 확장자를 사용하지 않는다. 단, 임베디드 시스템에서 사용하는 ROS 같은 경우는 C99와 C++11을 지원하면서 헤더 파일을 .h로 사용한다. 예를 들면 다음과 같다.

#include "ros/ros.h"
#include "std_msgs/String.h"

헤더 파일을 include 할 때 표현이 2개 있던데?

헤더 파일을 include 할때는, <> 와 " " 이렇게 2가지 표현이 있다.

#include <헤더파일이름>
이는 컴파일러가 설치되어 있는 폴더에서 헤더 파일을 찾으라는 명령어이다.

#include "헤더파일이름"
이는 사용자(개발자)의 프로젝트 폴더나, CMakeLists.txt 파일 등을 통해 컴파일 옵션으로 지정한 include 폴더에서 헤더 파일을 찾도록 지시한다.

헤더 파일에는 어떤 것이 들어있을까?

이것 역시 위에 컴파일러를 다루는 링크를 참조하면 된다. 간략하게 쓴다면, 라이브러리에는 이미 컴파일 된 함수의 구현 코드 등이 들어있고, 헤더 파일에는 함수의 원형(prototype)만이 들어있다. 헤더 파일은 컴파일을 진행할 때 함수의 호출이 정확한지 판단하는지 등에 활용할 수 있다.

cou과 cin은 모두 iostream 헤더 파일에 선언되어 있는 객체들이다.

profile
로봇, 드론, SLAM, 제어 공학 초보

0개의 댓글