[013] C++ Namespace와 구조체(struct) 차이 예제 (이름 충돌)

 

초보자를 위한 C++ 200제 독자 포스트의 이준우님 질문에 답글 올립니다.

namespace와 struct의 차이점이 무엇인가요??

책의 내용 중에 silla::year, baekjae::year을 C++ 구조체로도 사용할 수 있다고 생각돼서 질문합니다.

우선 답글에 앞서, namespace와 struct의 차이를 소개합니다.

c++ struct 네임스페이스 차이

 

namespace는 이름 충돌을 피하고자 같은 이름의 함수를 그룹화할 수 있습니다. 또한, 같은 이름의 형태(C++ 구조체, 변수, 함수 등)도 그룹화할 수 있습니다.

반대되는 예를 들어 보겠습니다. 아래와 같이 내부 함수는 다르지만, 이름이 같은 C++ 구조체라면 에러가 발생합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include “stdafx.h”
 
struct Exam1
{
    int GetOne()
        return 1;
};
 
struct Exam1
{
    int GetTen()
        return 10;
};
 
int main()
{
    return 0;
}
cs

 

C++ Namespace와 Struct 다른점 예제 (충돌 문제)

[에러 코드 C2011 : ‘Exam1’ : ‘struct’ 형식 재정의]

Exam1이란 구조체 이름이 같으므로 에러가 발생합니다.

즉, Exam1 이름의 C++ 구조체가 test1.h 파일과 test2.h 파일에 존재하면 그 둘을 함께 사용할 순 없습니다. 반드시 둘 중 하나의 이름을 변경해야 합니다. 이름 충돌이 발생하기 때문이죠.

하지만, 같은 이름의 네임스페이스는 이름 충돌에서 벗어납니다. 아래 코드는 에러가 발생하지 않습니다.

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
#include <iostream>
 
namespace Exam1
{
    int GetOne()
    {
        return 1;
    }
};
 
namespace Exam1
{
    int GetTen()
    {
        return 10;
    }
};
 
using namespace Exam1;
using namespace std;
 
int main()
{
    cout << “GetOne() = “ << Exam1::GetOne() << endl;
    cout << “GetTen() = “ <<  Exam1::GetTen() << endl;
 
    return 0;
}
cs
결과
1
2
GetOne() = 1
GetTen() = 10
cs

간략히 정리하면 이렇습니다.

Exam1 구조체 : test1.h, test2.h 모두에 존재하면 이름 충돌 때문에 헤더 파일의 C++ 구조체 이름 변경이 필요.

Exam1 네임스페이스 : 2개, 5개, 10개가 되어도 유효 영역은 분리되므로 이름 충돌에서 벗어남.

Namespace : 일반적으로 클래스에서 분리하여 독립된 개체로 운영. 상대적으로 제한 사항이 적고 느슨한 결합이 필요할 시, 해당 코드를 Namespace로 분리함.

Struct : 반면, Struct는 정량적, 가변적 데이터를 보유. 구조체 데이터는 특정 클래스, 함수에서 중요한 역할을 담당.

구조체는 항상 같은 크기(sizeof)지만 네임스페이스는 유동적.

구조체는 크기가 중요하지만 네임스페이는 크기가 중요하지 않음.

C++ 구조체는 중요한 데이터를 담는 것이 목적이지만,

네임스페이스는 이를 포함하는 개념.

구조체는 논리적으로 옳고 그름, 수집된 데이터의 적합성 등 정확해야 하는 가변 데이터를 저장합니다. 네임스페이스완 사용 방법이 전혀 다릅니다. 물론, 이것은 제가 생각하는 보편적이며 권장하는 사용 방법입니다. 회사 규칙, 코드 구성에 따라 성격은 변할 수 있습니다. 하지만, 저는 이렇게 사용하는 것이 옳다고 이야기하고 싶습니다.

그리고 확장 DLL 사용 시, 해당 DLL을 전담하는 네임스페이스를 별도로 두어 혹시 모를 이름 충돌에 대비하는 것도 좋습니다. 네임스페이스에 DLL을 사용하기 위한 각종 함수와 변수를 선언하되, 설령 다른 클래스의 변수와 이름이 똑같더라도 에러가 발생하지 않도록 하는 것이죠.

c++ 구조체 namespace 차이

 

다시, 처음 이준우님의 질문으로 돌아갑니다.

초보자를 위한 C++ 200제 13번 네임스페이스 배우기의 예제를 살펴보죠. 말씀처럼 silla:year, baekjae::year을 구조체로도 사용할 수 있습니다. 결론적으로, C++ 구조체로도 사용할 수 있는 것이 맞습니다. 책에선 위에 적은 설명이 없어서 네임스페이스와 구조체의 차이에 대해 궁금하셨을 것 같습니다.

13번 예제의 namespace 이름을 CentralArea로 바꿔서 생각해 보면, C++ 네임스페이스와 C++ 구조체의 차이에 대해 이해하시리라 생각합니다. 물론, 책에 제 설명이 부족했다는 점에 대해선 죄송스럽네요. 걍 봐주세요. ㅎㅎ

끝으로 이 포스트가 정확한 답변이 됐는지 궁금합니다. 그래도 궁금한 점이 있으시다면 언제든 댓글 달아주세요. 제가 최대한 아는 범위와 공부한 지식 더해서 답변하겠습니다.

덧글. 키워드 이름을 왜 네임스페이스로 지었는지 모르겠으나, “name”space인 것으로 보아 키워드 이름 지은 분도 “이름”영역에 역점을 두신 듯 싶습니다. 그리고 구조체는 “구조”체라는 이름에서도 알 수 있듯이 “구조”에 역점을 두고 이름을 지었다고 보여요.

[013] C++ Namespace와 구조체(struct) 차이 예제 (이름 충돌)