인터페이스는 어떤 클래스가
1.무엇을 할 수 있는지
2.무엇을 해야만 하는지
를 의미한다.

따라서 인터페이스에는 필드는 넣을 수 없으며
메소드나 메소드의 일종인 속성만 넣을 수 있다. (속성도 자동속성만 가능. 코드 삽입 불가)
또한 메소드의 prototype 만 넣을 수 있다. (코드 삽입 불가)

일반 클래스와는 달리 인터페이스는 다중 상속이 가능하다.
인터페이스를 상속 받은 클래스는 반드시 인터페이스에 포함된 모든 메소드를 구현해야 한다.
또한 어떤 일을 해야 하는지만을 명시하는 것이기 때문에 인스턴스화가 불가능하다.


예)
일벌은 
1.꿀만 딸수 있는 일벌
2.전투만 하는 일벌
3.꿀도 따고 전투도 하는 일벌
로 나누어 진다.

1과 2는 각각 다른 클래스로 만든다고 해도 3은 어찌할 것인가?

이 때, 1,2에 대한 인터페이스를 만들고
1,2,3에 대한 클래스를 각각 만들어서 필요한 인터페이스만 상속받아 구현하면 된다.

일벌에게 전투를 하라고 지시하는 여왕벌이 있다고 하자.
여왕벌 입장에서는 2든 3이든 간에 아무에게나 전투를 시키기만 하면 된다.
여왕벌 클래스에 일벌을 매개변수로 받아서 전투를 시키는 함수가 있다고 하면 
인터페이스를 쓰지 않는 경우 1,3 에 대해 각각 다른 함수를 만들어야 될 것이다.
이 방법은 쓸데없이 코드가 중복되어 매우 지저분하다.
인터페이스를 사용한다면 매개변수의 type이 전투인터페이스 이기만 하면 된다.
(부모class는 자식class을 가리킬(pointing) 수 있으므로..)
또한 인터페이스는 그것을 구현하는 클래스에서 인터페이스의 모든 메소드를 구현해야 하므로
여왕벌의 함수에서는 마음놓고 전투인터페이스의 어떤 함수라도 사용할 수 있다.

문제점 : 코드가 중복되는데??
본디 인터페이스는 코드 중복을 막기 위한 것이 아니다.
인터페이스를 쓴다고 해서 중복된 코드를 없앨 수 있는 것은 아니다.
어차피 3에 대한 클래스는 따로 만들어줘야 한다.


추가설명) 
인터페이스를 통해 클래스를 하는 일의 종류에 따라 분류할 수 있다.
이로 인해 특정 유형의 업무를 처리하는 클래스들은 서로 같은 메소드로 같은 일을 하게 만들 수 있다.
(클래스를 하는 일별로 나누고, 하는 일에 대한 표준을 제공)

예)
트럭 클래스와 요트 클래스가 있고
우리는 승객을 수송하는 일을 시키고 싶다.

인터페이스가 없을 경우 트럭 클래스와 요트 클래스에서 승객을 수송하는 함수의 이름이 다를 것이고
코드의 규모가 커질수록 이렇게 각기 다른 이름의 함수들을 일일히 찾는것은 매우 골치아픈 일이 된다.
그리고 각 클래스가 승객을 수송하는 일을 할 수 있는지 아닌지도 일일히 살펴봐야 한다.

표준 인터페이스가 있으면 위와 같은 문제로 머리아플 필요가 없다.









추상 클래스는 코드를 넣을 수 있는 인터페이스이다. ( 그 외의 점은 인터페이스와 거의 똑같다 )
인터페이스에 미리 코드를 좀 넣어서 상속받는 클래스에서 일부 메소드는 그대로 사용하고자 할 때 사용한다.
인터페이스와 마찬가지로 인스턴스화가 불가능하다.

추상 클래스에 있는 코드가 없는 메소드를 추상 메소드(abstract method) 라고 부른다. ( 반대말 : 구상 메소드(concrete method) )
추상 메소드가 1개라도 포함된 클래스는 반드시 추상 클래스로 선언하여야 한다.

상 클래스를 상속받은 클래스에서 추상 메소드를 구현할 때에는 반드시 override 키워드를 써야 한다.(인터페이스와의 차이점)
추상 클래스는 코드가 포함되므로 다중 상속이 불가능하다.(인터페이스와의 차이점)



덧) abstract class의 모든 메소드를 concrete method 로 만들수도 있는데,
     이런 클래스는 그냥 인스턴스 생성만 막는 의도로 만드는듯.

'C#, .NET' 카테고리의 다른 글

List 의 정렬 ( Sort() )  (0) 2011.06.17
property  (0) 2011.06.17
public, private, protected 와 상속  (0) 2011.06.17
upcasting, downcasting, 다형성  (0) 2011.06.17
C#에서 Win32 API 사용하기  (0) 2011.06.08
Posted by 휘사마
,