일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 연결 리스트
- 확장 엘리먼트
- 스택 배열
- javascript 생성자
- 배열
- pattern
- javascript this
- jQuery
- C#
- new 사용법
- 연동
- 큐 연결리스트
- 배열 스택
- 생성자 new
- 스택
- javascript new
- 생성자
- 추상적 자료 구조
- 포인터
- 연결리스트
- 이중 연결 리스트
- Index Range Scan
- npm Option
- Index Skip Scan
- Index Full Scan
- javascript prototype
- 자료구조
- Loose Index Scan
- access
- c언어 스택 배열
Archives
- Today
- Total
Open-Closed Principle
[C#] 내부 클래스 본문
오늘 알아볼 것은 내부 클래이다.
내부클래스??? 생소할 수도 있을것 같다.
하지만 잘 생각해보면 유용하게 사용 될 수 있는 여지가 충분히 있는 문법이다.
예를 들어 이런 클래스가 있다고 해보자.
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(); } |
내부에서만 사용하고 싶은 인터페이스를 외부에서도 호출이 가능해 짐으로써 프로그래머의 실수가 유도 될 수 있다.
내부 클래스에서 한정자를 효과적으로 사용하면 더 유용한 방법이 많을 것 같다.
다음께 써보자. ㅋㅋㅋ
이상 끝.........
'Programming > 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 |