강의/computer science

[ComputerScience] C++과 Namespace

하기싫지만어떡해해야지 2024. 9. 20. 12:54

이 게시글은

서울대학교 데이터사이언스대학원

조요한 교수님의

데이터사이언스 응용을 위한 컴퓨팅 강의를

학습을 위해 재구성하였습니다.


C++을 처음배울 때 흔히 가장 많이 배우는 것이

입력과 출력문 일 것이다

#include <iostream>

int main(void) {
    std::cout << "Hello C++!" << std::endl;
    return 0;
}

 

c++에서의 출력은 주로 

std::cout << ... << std::endl

이런 방식으로 많이 사용하고

입력을 받으려면

std::cin

과 같은 방식으로 많이 사용한다

 

cout과 cin 앞에 붙이는 이 std의 정체는

대체 무엇일까

 

이걸 이해하려면 c++에서의

namespace 개념을 이해해야한다

 

 

Namespace

 

cin과 cout은 이미 c++ 내부에 정의되어있는 변수이다

한마디로 c++을 개발하면서 이미 입력과 출력 기능을

사용할 수 있도록 predefined 해놓은 변수라는 뜻이다

 

cin은 istream이라는 class의

cout은 ostream이라는 class의 오브젝트이다

 

이 cin과 cout은 입력과 출력을 담당하는 오브젝트이므로

이를 한 범주로 묶어 관리하는데

이를 namesapce라고 하고

cin과 cout은 std라는 namespace에 정의되어있다

 

참고로 std는 c++ standard library의 약자

c++에서 공식적으로 정의해놓은 라이브러리이다

 

 

cin과 cout이라는 변수들이

global space에 정의되어있으면

만약 개발자가 다른 cin 혹은 cout이라는

변수를 정의하면 name 충돌이 날 수가 있다

 

이러한 것을 방지하기위해서 namespace 안에다

특정 기능들을 정의해주는 것이다

 

namespace는 하나의 named scope안에

여러 가지 entities들을 그룹핑한다

 

따라서 서로 다른 namespace 안에 있는

identifier들은 이름이 같아도 서로 다른걸로 취급하는데

객체지향의 캡슐화와 비슷한 개념이다

 

namespace에 있는 오브젝트들에 접근할 때는

std::cout과 같이

:: 로 접근을 해주는데

이 :: 를 scope resolution operator라고 한다

 

 

지속적으로 앞에 namespace이름과 resolution operator를

써주는 것이 귀찮다면 코드 상에서 미리 정의할 수도 있다

 

위의 예시와 같이 using first::x

와 같은 방식으로 미리 정의를 해주면

first라는 namespace안에 있는 오브젝트 x는

그냥 x와 같은 방식으로 호출할 수 있다

 

개발자 입장에서는 편하지만 name conflict가

일어날 가능성이 커지기 때문에

크게 권장되는 방식은 아니라고 한다

 

 

위 예시와 같이 namespace third = first;를 입력해주면

third라는 namespace를 한개 더 생성해서

first namespace에 접근할 수 있도록 해주겠다는 뜻이다

 

그럼 third::x와 같이 first에 있었던 x 오브젝트를

third로도 접근할 수 있다

 

 

그렇다면 namespace와 header는 동일한 것일까?

결론은 아니다

namespace는 파이썬의 모듈과는 다른 개념이며

header가 오히려 python의 모듈에 가깝다

 

namespace는 헤더파일 안에 조금씩 정의되어있는데

std로 예시를 들어서 설명하자면

std namespace도

iostream, string, algorithm이라는 헤더파일들 안에

각각 나누어서 정의되어있다

 

하나의 header file에 여러 개의 namespace가

정의되어있을 수 있다