Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!시작하기

Microsoft. NET 을 시작하는 분들을 위한 강좌입니다. 주로 기초적인 내용과 때론 기본적인 내용을 다룹니다

네임스페이스(Namespace)

작성자 : 박종명
최초 작성일 : 2008-07-02 (수요일)
최종 수정일 : 2008-07-02 (수요일)
조회 수 : 7180

* Namespace (네임스페이스)

네임스페이스는 프로그래밍의 요소를 논리적으로 구분 할 수 있는 키워드 입니다.

즉 클래스나 인터페이스, 구조체 등을 정의할 때 그 범위를 지정하는데 사용됩니다.

이 의미가 정확히 무슨 뜻이며 왜 네임스페이스를 사용하는지에 대해 하나씩 살펴보도록 하겠습니다.

 

= System 네임스페이스

앞서 Hello World 샘플에서 Main 함수를 다음과 같이 작성하였습니다.

System.Console.WriteLine("Hello World!");


여기서 Console 클래스는 System 네임스페이스에 정의되어 있습니다.
다음 그림은 msdn 에서 Console 클래스의 정의입니다


Console 클래스는 다음과 같은 형태로 선언되어 있음을 유추할 수 있습니다.

 

namespace System

{

    public static class Console

    {

        //Console 클래스 코드...

    }

}

 

결과적으로 Console 이라는 이름의 클래스는 System 이라는 이름의 네임스페이스 범주에 두겠다고 해석할 수 있습니다.

 

= 타입명의 중복

개발자가 직접 만드는 클래스의 이름을 Console 로 정의할 수 있을까요? 답은 가능하다 입니다. , 조건이 있습니다.
바로 이미 정의된 Console 클래스와 네임스페이스가 달라야 합니다.

만일 다음과 같이 동일한 네임스페이스에 이름이 같은 클래스가 정의된다면 컴파일에러가 발생합니다.

namespace MyNameSpace

{   

    class MyClass{}

 

    class MyClass{}

}


 


그러나 다음처럼 네임스페이스를 구분하면 동일한 이름의 클래스를 정의할 수 있습니다.

namespace MyNameSpace

{   

    class MyClass{}  

}

namespace MyNameSpace2

{   

    class MyClass { }

}


특정 타입의 이름을 식별하는데 네임스페이스 정보가 포함됩니다.

다시 말해 위의 코드에서 MyClass 클래스의 전체 이름은 MyNameSpace.MyClass 가 되는 것입니다.

 

이처럼 네임스페이스라는 논리적 범위를 달리하면 동일한 이름의 타입을 정의할 수 있게 됩니다.
이미 닷넷 라이브러리에 정의된 타입의 이름과 동일하게 정의할 경우, 혹은 다른 사람이 만든 타입명과 중복될 경우 유용합니다.

MSDN에서는 네임스페이스를 다음과 같이 설명합니다.

namespace 키워드는 범위를 선언하는 데 사용됩니다. 이 네임스페이스 범위를 사용하면 코드를 구성할 수 있으며 전역적으로 고유한 형식을 만들 수 있습니다

 

= 의미 있는 논리적 그룹

네임스페이스의 또 다른 이점은 개발자가 작성한 프로그래밍 요소(클래스 등)에 논리적으로 의미를 부여하여 그룹화 할 수 있다는 것입니다. 닷넷이 제공하는 라이브러리들도 제각각 의미 있는 이름의 네임스페이스로 구분하고 있습니다. 가령 입/출력과 관련된 타입들은 System.IO 네임스페이스에, 웹과 관련된 타입들은 System.Web 네임스페이스에 정의되어 있습니다.

 

= 네임스페이스 정의

네임스페이스는 namespace 라는 키워드를 사용하여 정의합니다.

네임스페이스는 다음의 프로그래밍 요소를 그룹화 할 수 있습니다.

즉 네임스페이스 하위 요소로 다음의 것들을 하나 이상 정의할 수 있습니다.

-         클래스

-         인터페이스

-         구조체

-         enum

-         대리자(delegate)

-         또 다른 네임스페이스

그리고 네임스페이스 이름에 ‘.(마침표)’ 를 사용할 수 있습니다. 마침표를 사용하면 네임스페이스를 계층화 시킬 수 있습니다.

namespace MyNameSpace.First

{   

    class MyClass{}  

}

namespace MyNameSpace.Second

{

    class MyClass { }

}

 

 

= 중첩된 네임스페이스

네임스페이스 하위로 다른 네임스페이스가 정의될 수 있습니다네임스페이스의 중첩이 가능하다는 말입니다.

namespace MyNameSpace

{   

    class MyClass{}

 

    namespace MyNameSpace2

    {

        class MyClass { }

    }

}

 


 

= using 지시문

using 지시문을 이용하면 네임스페이스 명을 매번 붙일 필요가 없습니다.
다시 Hello World 샘플코드를 보겠습니다

System.Console.WriteLine("Hello World!");

 

Console 클래스를 이용하기 위해 System 네임스페이스를 명시해야 했습니다.

그러나 다음처럼 using 지시문으로 System 네임스페이스를 미리 선언하면 이후부터는 네임스페이스의 명시를 하지 않고도 클래스들을 이용할 수 있습니다.

using System;

Console.WriteLine("Hello World!");

 

또한 using 을 이용하여 네임스페이스의 별칭을 정의할 수 있습니다.
다음의 코드를 보십시오. System 네임스페이스의 이름을 MKEX로 별칭 선언합니다.

이후 MKEX라는 별칭으로 해당 네임스페이스의 클래스를 이용하게 됩니다

using MKEX = System;

 

public class Program

{

    static void Main()

    {

        MKEX.Console.WriteLine("Hello World!");

    }

}

 

별칭을 만들 경우 다음과 같은 이점이 얻을 수 있습니다.

-         긴 네임스페이스 이름을 짧은 별칭으로 사용할 수 있다

-         좀더 직관적이고 우리 상황에 맞는 이름을 부여하여 좀 더 쉽게 사용할 수 있다

 


 

= 전역 네임스페이스 한정자

네임스페이스 참조 시 global 키워드를 사용하면 전역 네임스페이스를 참조할 수 있습니다.

다음의 경우를 보겠습니다.

이미 System 이라는 네임스페이스가 닷넷에 정의되어 있는데 개발자가 자신의 특정 타입의 이름을 System 으로 정의해 버리면 닷넷의 System 네임스페이스는 숨겨지게 됩니다.

다음의 코드를 보면 System 이라는 사용자 정의 클래스를 생성해 버립니다.

이미 System 이라는 네임스페이스가 있는데도 말이죠……

이 경우 Main 함수에서 사용하는 System 은 닷넷이 정의한 네임스페이스가 아닌 System 클래스를 가리키게 됩니다. 따라서 사용자가 정의한 System 클래스에는 Console라는 클래스의 정의가 없기 때문에 컴파일 에러를 발생시킵니다.

using System;

 

class MyClass

{   

    public class System { }

   

    static void Main()

    {

        System.Console.WriteLine("Hello World!");

    }

}

 

이럴 경우 전역 네임스페이스 한정자를 이용하여 문제를 해결할 수 있습니다. 
 

using System;

 

class MyClass

{   

    public class System

    {

        public static int value = 10;

    }

   

    static void Main()

    {

        global::System.Console.WriteLine(System.value);

    }

}

 

 

global 키워드를 사용하여 네임스페이스를 지정하면 전역 네임스페이스를 지정할 수 있게 됩니다.

샘플의 global::System.Console.WriteLine(System.value); 코드에서,

앞의 System 은 닷넷이 제공하는 System 네임스페이스를 가리키며 뒤 쪽의 System.Value System 은 사용자가 정의한 System 클래스를 가리킵니다.

물론 닷넷이 제공한 네임스페이스의 이름과 동일하게 타입명을 정의하는 것은 좋지 않습니다.
그러나 대규모 프로젝트에서는 네임스페이스의 이름과 타입의 이름이 이와 같이 중복되는 경우가 발생할 수 있으므로 알아 두시는 것이 좋습니다.

 

이상 네임스페이스에 대해 알아 보았습니다.

참고로 ASP.NET aspx 파일에서는 네임스페이스 참조를 using 가 아닌
<% Import namespace = “System” %>
형태로 선언합니다.

∵Commented by JosephMoon at 2014-10-15 오전 1:10:58  
namespace가 뭔지 궁금했는데 의문이 풀렸네요~
자바의 package 같은 개념인가요? ^^
이름
비밀번호
홈페이지
WD <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요