2010년 7월 11일 일요일

추상클래스와 인터페이스

#
추상클래스
1. 상속의 최상위에 존재한다.
2. new 연산자를 사용해서 객체생성을 할 수 없다.
3. 메서드가 없다. 상속받는 클래스에서 메서드를 재정의 해야한다.
4. 일반 메서드를 가질 수 있다. 파생 클래스에서 일반 메서드를 상속받아서 사용할 수 있다.
5. 추상 메서드(구현이 없고, 이름만 있는 메서드)는 파생 클래스에서 재정의 해서 이름을 바꾸지 않고 사용해야한다.


<설명>
추상클래스.. 추상적인 클래스다. 추상적이라는 의미는 실체가 없다는 뜻이다. 클래스의 실체가 없다는 뜻이다. 클래스의 실체가 무엇이냐. class의 구성요소를 member라고 하는데, member에는 field와 method가 있다. field는 변수를 의미하고 method는 함수라고 이해하도록 하자. 즉 field는 무언가 저장될 장소를 선언한 것이고, method는 입력값과 반환값이 있는 function이다. 물론 입력값, 반환값이 없을 수도 있다.
class의 실체는 method이다. 즉, 추상클래스는 method가 없는 class이다. method가 이름만 있고, method안에 구현 로직이 없다. 이 것을 추상클래스 (abstract class)라고 한다.
구현된 것이 없으니 new 연산자를 이용해서 인스턴스를 생성할 수 없다. 인스턴스 생성하기 전에 method를 새로 만들어야 한다.
추상클래스를 상속받은 파생클래스는 


class 파생클래스 : 추상클래스
{...}


의 형태로 선언하여 파생클래스 안에서 추상클래스 내에서 선언만 되어있는 메서드를 구현하여 사용한다.
위와 같이 사용되는 것을 추상클래스라고 한다.
하지만 추상클래스도 구현이 된 메서드를 가질 수 있다. 구현된 메서드를 일반메서드라고 한다. 일반메서드를 포함할 수 있다. (cf. 인터페이스는 일반메서드를 포함할 수 없다.)





#
인터페이스
개념

1. 추상 기본 클래스와 비슷함
    - 상속하는 모든 비추상형식에서는 해당 멤버를 모두 구현해야함
2. 직접 인스턴스화 할수 없음
3. 이벤트, 인덱서, 메서드 및 속성을 포함할 수 있음
4. 메서드의 구현을 포함하지 않음
5. 클래스와 구조체는 여러 인터페이스에서 상속할 수 있음
6. 인터페이스 자체는 여러 인터페이스에서 상속할 수 있음

#
C#에서는 기본적으로 다중상속이라는 스펙을 제외했다. 워낙 말이 많았기 때문이다.(?)
C++에서는 다중상속이라는 기능이 있었다.
그래서 C#이 단순해졌다.
다중상속을 흉내낸 것이 interface이다.

#

상위 클래스에서 virtual 이라는 키워드를 사용하면 자손클래스에서 new 혹은 override라는 키워드를 사용해서 메서드를 정의 혹은 재정의 할 수 있다.
override 는 상위클래스의 메서드도 사용하고 거기다가 추가해서, 더해서, 위에 덧씌워서, 오버(위에)라이드(올라타다), 즉 추가해서... 또 메서드를 정의해서 사용한다.
-> 상위 virtual 클래스가 있고, 자손클래스에서 new 키워드를 사용하고, 자손클래스에서 새로운 메서드를 정의하는데 new 키워드를 사용했으므로 파생 클래스 메서드가 호출되지 않고, 기본 클래스 메서드가 대신 호출된다.
 -> ? 이게 무슨 뜻이야? 이해는 가는데 왜 그렇게 써? 그럼 왜 새로 정의해? 사용되지도 않는데?

댓글 없음:

댓글 쓰기