본문 바로가기

오래된 흔적/C#.NET 기초강좌 #1

[HOONS C#.NET 기초강좌 #1] 06. 네임스페이스(namespace)


hoons닷넷
[ C#.NET 기초강좌 #1]
06. 네임스페이스(namespace)
작성자 : NGong 작성일 : 2011-04-15 오후 4:20:18
E-mail : filmgdh골뱅이gmail.com Homepage : http://blog.daum.net/coolprogramming
말 그대로 '이름 공간'이라는 뜻입니다.
개인이나 회사에서 만들어 놓은 형식의 이름 중복을 피하기 위한 논리적인 이름 공간 정도로 생각하면 되겠습니다.
  • A라는 회사에서 형식 Point를 만들어 놓았습니다 .
  • B라는 회사에서도 형식 Point를 만들어 놓았습니다.
  • 나는 A회사의 Point도 필요하고 B회사의 Point도 필요합니다. 어떻게 해야 할까요?
    • 결론은 namespace 개념이 없으면 모두를 사용할 수는 없습니다. namespace가 있다면 모두 사용할 수 있습니다.

namespace.jpg

그래서 개인이나 회사는 자신만의 유니크한 네임스페이스를 만들어 형식을 정의해야 합니다.

네임스페이스는
namespace 이름 { 형식 정의 } 와 같이 사용합니다.

다음 예제는 Point 클래스를 두 네임 스페이스 공간(A, B)에 각각 정의했습니다.
  1. namespace A

    {

    class Point

    {

    private int x, y;

    public Point(int _x, int _y)

    {

    x = _x;

    y = _y;

    }

    public void Print()

    {

    System.Console.WriteLine("A:({0},{1})", x, y);

    }

    public static void StaticMethodA()

    {

    System.Console.WriteLine("StaticMethodA");

    }

    }

    }

    namespace B

    {

    class Point

    {

    private int x, y;

    public Point(int _x, int _y)

    {

    x = _x;

    y = _y;

    }

    public void Draw()

    {

    System.Console.WriteLine("B:({0},{1})", x, y);

    }

    public static void StaticMethodB()

    {

    System.Console.WriteLine("StaticMethodB");

    }

    }

    }

    namespace NetGong

    {

    class Program

    {

    static void Main()

    {

    A.Point pt1 = new A.Point(2, 3);

    pt1.Print();

    A.Point.StaticMethodA();


    B.Point pt2 = new B.Point(2, 3);

    pt2.Draw();

    B.Point.StaticMethodB();

    }

    }

    }

A:(2,3)
StaticMethodA
B:(2,3)
StaticMethodB
네임스페이스는 형식 이름과 함께 하나의 이름으로 동작합니다.
예로
  • namespace A 내의 Point는 A.Point 형식입니다.

    • Point 내의 static 메소드 StaticMethodA는 A.Point.StaticMethodA입니다.

  • namespace B 내의 Point는 B.Point 형식입니다.

    • Point 내의 static 메소드 StaticMethodB는 B.Point.StaticMethodB입니다.

  • namespace NetGong 내의 Program은 NetGong.Program 형식입니다.

    • Program 내의 static 메소드 Main은 NetGong.Program.Main입니다.

그림을 참고하세요.
namespace2.PNG

만약 이름 겹침이 없을 때 네임스페이스를 생략하고자 한다면 using 키워드를 사용할 수 있습니다.

다음은 namespace A를 using 키워드를 사용하여 오픈한 예제입니다.
  1. using A;

    namespace A

    {

    class Point

    {

    private int x, y;

    public Point(int _x, int _y)

    {

    x = _x;

    y = _y;

    }

    public void Print()

    {

    System.Console.WriteLine("A:({0},{1})", x, y);

    }

    public static void StaticMethodA()

    {

    System.Console.WriteLine("StaticMethodA");

    }

    }

    }

    namespace B

    {

    class Point

    {

    private int x, y;

    public Point(int _x, int _y)

    {

    x = _x;

    y = _y;

    }

    public void Draw()

    {

    System.Console.WriteLine("B:({0},{1})", x, y);

    }

    public static void StaticMethodB()

    {

    System.Console.WriteLine("StaticMethodB");

    }

    }

    }

    namespace NetGong

    {

    class Program

    {

    static void Main()

    {

    Point pt1 = new Point(2, 3);

    pt1.Print();

    Point.StaticMethodA();


    B.Point pt2 = new B.Point(2, 3);

    pt2.Draw();

    B.Point.StaticMethodB();

    }

    }

    }

A:(2,3)
StaticMethodA
B:(2,3)
StaticMethodB
결과는 위와 같습니다.

여기서 B의 네임스페이스도 없이 사용하려면 어떻게 할까요?
다음은 에러입니다.
  1. using A;

    using B;

    namespace A

    {

    class Point

    {

    private int x, y;

    public Point(int _x, int _y)

    {

    x = _x;

    y = _y;

    }

    public void Print()

    {

    System.Console.WriteLine("A:({0},{1})", x, y);

    }

    public static void StaticMethodA()

    {

    System.Console.WriteLine("StaticMethodA");

    }

    }

    }

    namespace B

    {

    class Point

    {

    private int x, y;

    public Point(int _x, int _y)

    {

    x = _x;

    y = _y;

    }

    public void Draw()

    {

    System.Console.WriteLine("B:({0},{1})", x, y);

    }

    public static void StaticMethodB()

    {

    System.Console.WriteLine("StaticMethodB");

    }

    }

    }

    namespace NetGong

    {

    class Program

    {

    static void Main()

    {

    Point pt1 = new Point(2, 3);

    pt1.Print();

    Point.StaticMethodA();


    Point pt2 = new Point(2, 3);

    pt2.Draw();

    Point.StaticMethodB();

    }

    }

    }

Point가 어느 이름 공간을 사용하는지 알지 못하기 때문입니다.
사실 위 내용을 피하려고 '네임스페이스'를 사용하는 것이니까요.

using 키워드의 이름지정을 사용하여 문제를 해결할 수 있습니다.
using의 이름지정을 사용하여 새로운 별명을 만들 수 있습니다.
  1. using A;

    using BPoint=B.Point;

    namespace A

    {

    class Point

    {

    private int x, y;

    public Point(int _x, int _y)

    {

    x = _x;

    y = _y;

    }

    public void Print()

    {

    System.Console.WriteLine("A:({0},{1})", x, y);

    }

    public static void StaticMethodA()

    {

    System.Console.WriteLine("StaticMethodA");

    }

    }

    }

    namespace B

    {

    class Point

    {

    private int x, y;

    public Point(int _x, int _y)

    {

    x = _x;

    y = _y;

    }

    public void Draw()

    {

    System.Console.WriteLine("B:({0},{1})", x, y);

    }

    public static void StaticMethodB()

    {

    System.Console.WriteLine("StaticMethodB");

    }

    }

    }

    namespace NetGong

    {

    class Program

    {

    static void Main()

    {

    Point pt1 = new Point(2, 3);

    pt1.Print();

    Point.StaticMethodA();


    BPoint pt2 = new BPoint(2, 3);

    pt2.Draw();

    BPoint.StaticMethodB();

    }

    }

    }

A:(2,3)
StaticMethodA
B:(2,3)
StaticMethodB
출력은 위와 같습니다.

마지막으로 지금까지 사용했던 System.Console.WriteLine() 함수
namespace System 내의 Console 클래스의 정적(static) 함수 WriteLine()을 사용한 것이므로
아래처럼 using System; 을 사용할 수 있습니다.
  1. using System;

    namespace NetGong

    {

    class Program

    {

    static void Main()

    {

    Console.WriteLine("Hello!");

    }

    }

    }

Hello!
Console 클래스 => http://msdn.microsoft.com/ko-kr/library/system.console.aspx

여기까지.. ^^