네임스페이스는 C++에도 있다. 이름의 충돌을 방지하고, 코드의 조직화를 돕는다. C#에서도 딱히 다를게 없어 보인다. 다만, C#은 철저한 객체지향 언어이고, 전역이라는 개념이 없기 때문에, C++처럼 namespcae안에 함수를 구현하고 그럴수는 없다.
- namespace안에 선언할 수 있는 형식
- class
- interface
- struct
- enum
- delegate
- nested namespaces can be declared except in file scoped namespace declarations(중첩된 네임스페이스는 파일 범위 네임스페이스 선언 내부에서를 제외하고 선언할 수 있습니다.)
C++에서 익숙하기도 하고, interface문법 같은 경우 Unreal Engine때문에 공부한 적이 있기 때문에, 위 형식들 중 5번과 6번을 제외하고는 대략적으로 다 아는 개념이다. 일단 delegate는 C++의 함수포인터나 std::function처럼 사용할 수 있는 것으로 알고있긴 한데, 지금 주제에서 다룰 키워드는 아닌 것 같다.
대충 보니 nested namespce와 file scoped namespace만 뭔지 알면 6번의 의미가 무슨 뜻인지 명확해질 듯 하다.
nested namespace
namespace 안에 namespace를 선언하는 것을 말한다.
namespace OuterNamespace
{
namespace InnerNamespace
{
public class MyClass
{
// 클래스 내용
}
}
}
file scoped namespace
파일의 위에 선언함으로써 파일 내부의 모든 코드를 namespace로 묶는 기능. {}사용을 하지 않아도 된다.
namespace MyNamespace;
public class MyClass
{
// 클래스 내용
}
결과적으로 6번의 내용을 정리하자면, namespace 안에 namespace를 또 선언하는것은 가능하지만, file scoped namespace 안에서는 namespace를 선언하는것이 불가능하다는 뜻이다.
Main쪽에서 사용해보자.
아직 제대로 공부하지는 않았지만, Console이라는 클래스는 System이라는 namespace 안에 존재하는 듯 하다. 그렇다는 것은 다음과 같이 쓸 수도 있다는 뜻이다.
이런식으로 앞에 namespace.을 붙임으로써 내부 기능에 접근할 수 있다.
C++문법으로 쓴다면 System::Console::WriteLine("~~~")이 됐을 것이다.
C++과 크게 다르지 않네요. 다음에는 System을 안쓰고도 Console에 접근하게 해주는 키워드 using에 대해서 공부해보겠습니다. 예상이지만 이것도 C++과 비슷하지 않을까 생각합니다.