... | ... | @@ -911,6 +911,7 @@ namespace ConsoleApplication1 |
|
|
구현 없는 메서드 선언이 포함되어 있다. 다중 상속이 불가능하기 때문에 그것을 대체하기 위해서 쓴다. C# 컴파일러가 인터페이스의 메서드를 가상메서드로 간주하고 있기 때문에 인터페이스에서 virtual 예약어와 자식클래스에서 override 예약어를 쓰지 못하게 막는다.
|
|
|
* public을 명시해서 메서드 구현시 그 메서드는 클래스의 멤버로 호출 가능하다.
|
|
|
* public을 생략하면 인터페이스명.메서드명()으로 구현해야 하고 호출 또한 해당 인터페이스로 형변환 한 다음 호출해야한다.
|
|
|
|
|
|
```c#
|
|
|
class Computer { }
|
|
|
|
... | ... | @@ -934,3 +935,78 @@ class NoteBook : Computer, IMonitor, IKeyboard |
|
|
}
|
|
|
```
|
|
|
|
|
|
##### 인터페이스와 다형성
|
|
|
|
|
|
```c#
|
|
|
interface IDrawingObject //인터페이스의 메서드는 가상 메서드이기 때문에 다형성의 특징이 적용된다.
|
|
|
{
|
|
|
void Draw();
|
|
|
}
|
|
|
|
|
|
class Line : IDrawingObject
|
|
|
{
|
|
|
public void Draw()
|
|
|
{
|
|
|
Console.WriteLine("선을그린다.");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class Circle : IDrawingObject
|
|
|
{
|
|
|
public void Draw()
|
|
|
{
|
|
|
Console.WriteLine("원을그린다.");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
class Character { } //IDraingObject를 상속받지 않음.
|
|
|
|
|
|
|
|
|
class InterfaceTest
|
|
|
{
|
|
|
public static void Main()
|
|
|
{
|
|
|
IDrawingObject[] instances = new IDrawingObject[] { new Line(), new Circle() };
|
|
|
//인터페이스는 개별 객체로는 new 할 수 없지만 객체배열로는 가능하다.
|
|
|
|
|
|
IDrawingObject instance = new Line(); //인터페이스를 직접 new 하지 않고 이런식으로 활용 가능.
|
|
|
instance.Draw(); //선을그린다 출력.
|
|
|
|
|
|
object[] compareArr = new object[] { new Line(), new Circle(), new Character()};
|
|
|
|
|
|
foreach (object obj in compareArr) //인터페이스 자체를 상속 받았는지 여부로 클래스 구분 가능.
|
|
|
{
|
|
|
if (obj is IDrawingObject) Console.WriteLine("인터페이스를 상속받음.");
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
##### 인터페이스와 콜백
|
|
|
인터페이스로도 콜백을 구현 가능하다. 델리게이트와 차이는 다음과 같다.
|
|
|
* 델리게이트는 각 메서드 시그니쳐에 따라 다르게 정의해야 하지만, 인터페이스는 하나의 타입에서 여러 개의 메서드를 정의 가능하다.
|
|
|
* 델리게이트는 한 번에 여러 개의 메서드를 담을 수 있어서 한 번에 여러 개의 메서드 호출이 가능하다.
|
|
|
따라서 다중 호출에 대한 필요성이 없다면 인터페이스로 콜백을 구현하는 것이 일반적이다.
|
|
|
|
|
|
```c#
|
|
|
class AgeCompare : IComparer
|
|
|
{
|
|
|
public int Compare(object x, object y) //원래 Compare함수는 오름차순 정렬이지만, 내림차순 정렬로 재구현
|
|
|
{
|
|
|
Person person1 = x as Person;
|
|
|
Person person2 = y as Person;
|
|
|
|
|
|
if (person1.Age > person2.Age) return -1; //앞에가 작으면 1, 같으면 0, 크면 -1;
|
|
|
else if (person1.Age == person2.Age) return 0;
|
|
|
else return 1;
|
|
|
}
|
|
|
}
|
|
|
Array.Sort(PersonArray, New AgeCompare()); //나이를 기준으로 내림차순 정렬된다.
|
|
|
```
|
|
|
|
|
|
##### IEnumerable 인터페이스
|
|
|
자바의 Iterator와 비슷하다.
|
|
|
IEnumerable 인터페이스를 구현하고 있는 클래스는 열거자를 통해 get(), MoveNext() 등의 메서드를 쓸 수 있다.
|
|
|
>foreach의 in 다음에 오는 객체가 IEnumerable 인터페이스를 구현하고 있다면 요소 열거가 가능하다.
|
|
|
|