본문 바로가기
프로그래밍/C++

C++의 namespace의 사용법과 이유(1)

by Hwan2 2018. 6. 24.
반응형

C++에는 C에 없는 namespace라는 기능이 존재합니다.

 

namespace라는 기능을 설명하기에 앞서 C++에 특지에 대해 이해하고 넘어갑시다!!

C++은 객채지향 언어입니다. C언어는 절차지향 언어이지요. 

이 둘을 나눈다면 크게 이렇게 나눌 수 있을겁니다.

 

그럼 객채지향 언어의 특징은 무엇이냐? 

대표적으로 이식성이 좋다는 겁니다.

 

쉽게 말해서 '어느 잘 만들어진 프로그램' 의 함수와 기능들을 '다른 프로그램에 이용하고 싶을때'

함수충돌, 변수충돌 등의 문제들을 문제없이 사용할 수 있다는 점입니다.

 

그 이유는 클래스라는 개념과 namespace 덕분에 가능한데 자세한 설명을 나중에 작성하도록 하겠습니다.

 

여기서는 그냥 이렇다라고 읽으시고 넘어가시길 바랍니다.

 

그럼 namespace에 대해 설명하겠습니다.

 

namespace는 작은 모듈화라고 보시면 됩니다.

같은 이름이라도 모듈을 다르게 해서 구분을 짓는 것이지요.

 

제가 아직 대규모 프로젝트경험이 없지만 namespace의 경우 소규모가 아닌 대규모 프로젝트를 할때

유용하게 쓰일 것입니다. (물론 소규모에서도 사용은 할 것입니다.)

 

--------------------------------------------------------------------------------------------------------------------------------

여기서 부턴 개인적인 견해입니다만

과거 제가 친구 1명과 프로젝트를 진행한적이 있는데 (C와 JAVA를 사용해서) 합처보니 대략 1000줄정도 됐습니다.

이 경우 함수충돌, 변수충돌은 없었지만 static으로 선언된 것들은 간혹 겹치는 경우가 있었습니다.

 

하지만 회사에 들어가서 대규모 프로젝트를 진행한다는 가정하에 보면

기본 1만줄은 거뜬히 넘을 것이고 사람수도 최소 5명이상은 참가할 것이라고 봅니다.

이런 경우 함수와 변수들을 하나도 안겹치도록 서로 의논하고 만드는 것은 어려울 것이라고 생각됩니다.

프로젝트를 진행하다보면 예상치 못한 기능들을 추가하거나 수정하는 일이 비일비재하기 때문입니다.

 

때문에 작은 것들이라도 모듈화 즉 서로 구분짓는 기술이 필요할 것입니다.

--------------------------------------------------------------------------------------------------------------------------------

 

잡소리가 길었으니 본론으로 들어가겠습니다.

 

A라는 친구와 B라는 친구가 서로 함수를 정의했고 서로 합처서 프로그램을 실행시킬려 했는데 문제가 발생합니다.

 

A가 만든 함수

void printOut () { std::cout<<"A 출력!"<<std::endl;}

 

B가 만든 함수

void printOut () { std::cout<<"B 출력!"<<std::endl;}

 

서로 동일하게 만든 것입니다. 

 

(예시로 간단하게 들어서 그렇지 1만줄 이상되는 상태에서 이런 것들을 일일이 찾아 수정하는 '삽질'은 정말 시간낭비일 것입니다.)

 

이런 문제점들을 해결하기위해 namespace 기능을 사용합니다.

 

namespace IamA

{

void printOut () { std::cout<<"출력!"<<std::endl;}

}

 

namespace IamB

{

void printOut () { std::cout<<"출력!"<<std::endl;}

}

이렇게 정의하면 서로 구분되어 실행이 잘 될것입니다.

 

예제를 봅시다.!!

namespace IamA
{
    void printOut() { std::cout << "출력!" << std::endl; }
}

namespace IamB
{
    void printOut() { std::cout << "출력!" << std::endl; }
}

void main() {
    IamA::printOut();
    IamB::printOut();
}
​

 

 

위 예제에서 사용된 ::을 가르켜 '범위지정 연산자(scope resolution operator)'라 하며, 

 

그 이름이 의미하듯이 이름공간을 지정할 때 사용하는 연산자 입니다.

 

출처 : 윤성우 저자의 C++프로그래밍

(이보다 더 정확하게 설명하기는 힘들 것 같아서 그대로 옮겨 적었습니다.....)

 

이 이론을 토대로 함수의 선언과 정의를 구분 지을 수 있습니다.

#include<iostream>

namespace IamA{ void printOut();}

namespace IamB{ void printOut();}

void main() {
    IamA::printOut();
    IamB::printOut();
}

void IamA::printOut() { std::cout << "출력!" << std::endl; }

void IamB::printOut() { std::cout << "출력!" << std::endl; }​

 

일반적으로 C나 C++프로그램을 짤때 가독성을 위해 함수의 선언을 미리 해놓고 뒤에 정의하는 방식과 동일합니다.

이런식으로 선언과 정의가 가능합니다.

 

간단한 예제를 설명하는데 서론이 너무 길었습니다.......

다음장에서는 using의 사용법에 대해 설명하겠습니다.

 

잘못된 부분이 있으면 댓글 달아주세요~ 바로 고칠꼐요~

반응형

댓글


스킨편집 -> html 편집에서