Open-Closed Principle

[C#] 내부 클래스 본문

Programming/C#

[C#] 내부 클래스

대박플머 2014. 6. 16. 11:14

오늘 알아볼 것은 내부 클래이다. 

내부클래스??? 생소할 수도 있을것 같다. 

하지만 잘 생각해보면 유용하게 사용 될 수 있는 여지가 충분히 있는 문법이다. 

예를 들어 이런 클래스가 있다고 해보자. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
 
public class OutClass{
    #region IoutClass 멤버
    void DoSomeThing(){
        Console.WriteLine("OutClass DoSomeThing Method!");
    }
    #endregion IOutClass 멤버
    
    public static void Main(){
        OutClass outClass = new OutClass();
        outClass.DoSomeThing();
    }
}
public Interface IOutClass{
    void DoSomeThing();
}

이렇게 특정 인터페이스를 통해서 어떤 일을 하고자 Class가 있을 경우에 내부클래스를 사용하는게 좋을 때가 있다. 

이유를 먼저 이야기 하자면 내부클래스는 한정자(private)를 통해서 내부로의 호출을 막을 수 있기 때문에 내부에서만 사용되는 함수를 만는 경우 아주 유용하다. 

예제 소스를 보면 이해하기 쉬울 것이라고 생각이 된다. 

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
29
using System;
 
public class Program{
    public static void Main(){
        OutClass outClass = new OutClass();
        OutClass.InClass_2 inClass = new OutClass.InClass_2();
        inClass.DoSomeThing();
    }
}
 
public class OutClass{
    private InClass_1 _inClass;
 
    public OutClass_1(){
        _inClass = new InClass_1();    
        _inClass.DoSomeThing();
    }
 
    private Class InClass_1 { // private 내부 클래스
        public void DoSomeThing(){
            Console.WriteLine("private InClass Method Call!");
        }
    }
    public class InClass_2{  // public 내부 클래스
        public void DoSomeThing(){
            Console.WriteLine("public InClass Method Call!");
        }
    }
}

private로 만들게 되면 내부에서만 사용할 수 있는 클래스가 하나 생성되지만 외부에서는 사용 할 수 없다. 

public으로 만들게 되면 내부에서 만든 내부클래스를 외부에서 사용 할 수 있다. 

이게 어떤 장점이 있을까? 

이렇게 되면 내부 클래스가 인터페이스를 상속받았을 때 장점이 나온다. 

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
public class Program
{
    public static void Main()
    {
        OutClass1 outClass1 = new OutClass1();
        outClass1.DoSomeThing1(); // 생성자에서만 호출하고 싶지만 외부 호출도 가능
        outClass1.DoSomeThing2(); // 생성자에서만 호출하고 싶지만 외부 호출도 가능
 
        OutClass2 outClass2 = new OutClass2(); // InClass의 내부함수 호출 불가능
    }
}
 
public class OutClass2
{
    private InClass _inClass = new InClass();
 
    public OutClass2()
    {
        _inClass.DoSomeThing1();
        _inClass.DoSomeThing2();
    }
 
    private class InClass : IInInterface1,IInInterface2
    {
        #region IInInterface1 멤버
        public void DoSomeThing1()
        {
            Console.WriteLine("InClass Interface DoSomeThing1 Method Call !");
        }
        #endregion
 
        #region IInInterface2 멤버
        public void DoSomeThing2()
        {
            Console.WriteLine("InClass Interface DoSomeThing2 Method Call !");
        }
        #endregion
    }
}
 
public class OutClass1 : IInInterface1, IInInterface2
{
    public OutClass1()
    {
        DoSomeThing1(); // 생성자에서만 호출 가능
        DoSomeThing2(); // 생성자에서만 호출 가능
    }
 
 
    #region IInInterface1 멤버
    public void DoSomeThing1() // Interface의 경우 private 한정자를 사용 할 수 없음
    {
        Console.WriteLine("DoSomeThing1 Call");
    }
    #endregion
 
    #region IInInterface2 멤버
    public void DoSomeThing2()
    {
        Console.WriteLine("DoSomeThing2 Call");
    }
    #endregion
}
 
public interface IInInterface1
{
    void DoSomeThing1();
}
 
public interface IInInterface2
{
    void DoSomeThing2();
}

내부에서만 사용하고 싶은 인터페이스를 외부에서도 호출이 가능해 짐으로써 프로그래머의 실수가 유도 될 수 있다. 

내부 클래스에서 한정자를 효과적으로 사용하면 더 유용한 방법이 많을 것 같다. 

다음께 써보자. ㅋㅋㅋ 

이상 끝.........