오늘 알아볼 것은 내부 클래이다.
내부클래스??? 생소할 수도 있을것 같다.
하지만 잘 생각해보면 유용하게 사용 될 수 있는 여지가 충분히 있는 문법이다.
예를 들어 이런 클래스가 있다고 해보자.
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(); } |
내부에서만 사용하고 싶은 인터페이스를 외부에서도 호출이 가능해 짐으로써 프로그래머의 실수가 유도 될 수 있다.
내부 클래스에서 한정자를 효과적으로 사용하면 더 유용한 방법이 많을 것 같다.
다음께 써보자. ㅋㅋㅋ
이상 끝.........
'C#' 카테고리의 다른 글
[C#] Cross Thread로인한 InvalidOperationException해결법 (0) | 2014.06.16 |
---|---|
[C#] 람다 표현식 (0) | 2014.06.16 |
[C#] 소멸자 Finalize (0) | 2014.06.13 |
[C#] Delegate 사용법 (0) | 2014.06.12 |
[C#]명령 프롬프트에서 컴파일 하기 CSC.exe (0) | 2014.06.11 |