이 게시글은
서울대학교 데이터사이언스대학원
조요한 교수님의
데이터사이언스 응용을 위한 컴퓨팅 강의를
학습을 위해 재구성하였습니다.
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가
정의되어있을 수 있다