Favicon

Namespace

Peponi12/11/20243m

C#
SyntaxKeywordNamespace

1. Introduction

namespace 키워드는 코드를 구성하는 고유한 전역 형식을 선언하는 데 사용한다. 모든 namespace는 암시적으로 public이며 한정자를 적용할 수 없다.

namespace 내에는 다음과 같은 형식을 선언할 수 있다.

2. Example

namespace 선언
namespace Foo
{
    class Bar { }
 
    namespace Nested
    {
        class MyClass { }
    } 
}

namespacepartial 형식과 마찬가지로 여러 파일에 나누어 선언할 수 있다.

File1.cs
namespace Foo
{
    class Bar { }
}
File2.cs
namespace Foo
{
    namespace Nested
    {
        class MyClass { }
    }
}

상기 File2.cs의 선언은 아래의 선언과 동일하다.

File2.cs
namespace Foo.Nested
{
    class MyClass { }
}

3. File scoped namespace

C# 10 버전 이상에서는 파일 단위 namespace 선언이 가능하다.

File1.cs
namespace Foo;
 
class Bar { }

상기 예시와 같이 namespace를 선언하게 되면 File1.cs에 있는 모든 코드는 Foo namespace에 속하는 것으로 간주되며 여러 파일에 걸쳐 적용할 수도 있다.

File1.cs
namespace Foo;
 
class Bar { }
File2.cs
namespace Foo;
 
class MyClass { }

한편 file scoped namespace 선언은 nested를 허용하지 않는다. 아래와 같은 namespace 선언은 파일 단위 네임스페이스에서는 불가능하다.

File1.cs
namespace Foo;
 
class Bar { }
 
namespace Nested;    // CS8954
namespace Nested { } // CS8955

4. Default namespace

모든 네임스페이스의 최상위 요소에는 컴파일러가 추가한 기본 네임스페이스가 있다. Console project에 추가되는 ConsoleApp namespace, WinForms project에 기본으로 추가되는 WinFormsApp namespace 등은 모두 기본 네임스페이스 아래에 있다.

Assembly 1
using System;
 
// default namespace (Global)
 
public class DefaultNSClass
{
    public void Write() => Console.WriteLine("Hello, World!");
}
 
namespace ConsoleApp1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            DefaultNSClass defaultNSClass = new DefaultNSClass();
            defaultNSClass.Write();
        }
    }
}
Assembly 2
using System;
 
namespace ConsoleApp2
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            // Don't need to declare 'using ~'
            DefaultNSClass defaultNSClass = new DefaultNSClass();
            defaultNSClass.Write();
        }
    }
}

5. 참조 자료