참고 사이트 : http://msdn.microsoft.com/ko-kr/library/ms173156.aspx
선문비트 프로젝트 : http://cafe.daum.net/smbitpro?t__nil_cafemy=item
작성날짜 : 2011-03-24 |
인터페이스
인터페이스는 구현 약속입니다.
인터페이스는 암시적 추상 클래스로 직접 인스턴스화 할 수 없습니다. 가장 특징적인 것은 인터페이스 정의 자체에서는 구현을 포함하지 않으면 인터페이스를 상속한 비추상 형식에서는 반드시 구현해야 합니다.
그리고, 인터페이스는 메서드와 속성, 이벤트, 인덱서의 조합으로 구성될 수 있으면 필드는 포함할 수 없습니다.
인터페이스의 멤버는 액세스 권한이 public이며 필요에 따라 명시적 구현을 할 수 있습니다.
만약, 상속받는 두 개의 인터페이스에 이름이 동일한 멤버가 있다면 반드시 명시적 구현을 해야 합니다.
interface IStudy Class
interface IStudy { int StuNum { get; } void Study(); void Work(); }
interface ITeach { int TeaNum { get; } void Teach(); void Work(); } |
Man Class
class Man { string name; public string Name { get { return name; } protected set { name = value; } } public Man(string _name) { name = _name; } }
class Stu : Man, IStudy { int snum; public Stu(string _name, int _snum) : base(_name) { snum = _snum; } public int StuNum { get { return snum; } } public void Work() { Console.WriteLine("{0}번 {1} 열심히 예습 중", snum, Name); } public void Study() { Console.WriteLine("{0}번 {1} 열심히 공부 중", snum, Name); } }
class Teacher : Man, ITeach { int tnum; public Teacher(string _name, int _tnum) : base(_name) { tnum = _tnum; } public int TeaNum { get { return tnum; } } public void Work() { Console.WriteLine("{0}번 {1} 열심히 연구 중", tnum, Name); } public void Teach() { Console.WriteLine("{0}번 {1} 열심히 강의 중", tnum, Name); } }
class PartTimeStu : Stu, ITeach { int tnum; public PartTimeStu(string _name, int _snum, int _tnum) : base(_name, _snum) { tnum = _tnum; } public int TeaNum { get { return tnum; } }
// 명시적 구현.Access 접근 권한을 설정 할 수 없다. void ITeach.Work() { Console.WriteLine("{0}번 {1} 열심히 연구 중", tnum, Name); }
//오류 CS0106: 'public' 한정자는 이 항목에 사용할 수 없습니다. public void ITeach.Work() { }
// 이럴 경우 이름 충돌이 남. // 이와 같은 경우에 명시적 구현을 통해 오류를 해결할 수 있습니다. void Work() { }
public void Teach() { Console.WriteLine("{0}번 {1} 열심히 강의 중", tnum, Name); } } |
위의 클래스들을 사용하는 클래스
class Program { static void Main(string[] args) { //Study istudy = new IStudy(); Man[] mans = new Man[3];
mans[0] = new Stu("홍길동", 3); mans[1] = new Teacher("강감찬", 4); mans[2] = new PartTimeStu("안중근", 5, 6); foreach (Man man in mans) { IStudy istudy = man as IStudy; ITeach iteach = man as ITeach;
Console.WriteLine(man.Name); if (istudy != null) { istudy.Work(); istudy.Study(); } if (iteach != null) { iteach.Work(); iteach.Teach(); } } } } |
C++에서는 클래스 다중 상속을 지원했지만 C#에서는 다중 클래스 상속을 지원하지 않습니다.
대신 다중 인테페이스 구현 약속을 할 수 있게 함으로써 논리적 명확함과 구현의 유연성을 제공하고 있습니다. C#에서 인터페이스를 잘 사용을 한다면 논리적으로 강한 OOP를 추구하는데 많은 도움이 될 것입니다. 인터페이스 형식의 직접적인 개체 인스턴스를 생성을 할 수는 없지만 인스턴스의 형식 변수에 런타임 타입을 인지할 수 있는 as연산이나 is연산과 명시적 캐스트를 통한 형식변환을 하여 통일된 방법으로 개체들을 관리를 할 수 있다는 것을 숙지하여 자신의 것으로 소화하시기 바랍니다. 앞으로 컬렉션등의 강의를 통해 기본 클래스 라이브러리에 정의되어 있는 표준 인터페이스들에 대해서 살펴볼 기회가 있을 것입니다. 이들에 대한 선행 학습을 하시면서 인터페이스의 강력함을 만끽하시기 바랍니다.
'Programming > .NET' 카테고리의 다른 글
[.NET] Static (0) | 2015.05.19 |
---|---|
[.NET] Const 와 readonly (0) | 2015.05.19 |
[.NET] Property(속성) (0) | 2015.05.11 |
[.NET] .NET 형식 (0) | 2015.05.11 |
[.NET] .NET 개요 (0) | 2015.05.11 |