'추상클래스와 인터페이스'에 해당되는 글 1건

  1. 2008/02/02 인터페이스와 추상클래스

인터페이스와 추상클래스

관심거리 2008/02/02 11:17 posted by isili

객체지향 프로그래밍에서 인터페이스추상클래스 사이의 차이점을 설명하시오.


이런 문제가 주어질 경우, 솔직히 잘 모르기 때문에 인터넷 검색 찬스를 쓰겠습니다.

원래 여기는 .. 네이버 검색 이미지가 들어가야할 곳인데. 업로드가 잘 안되므로 패스.

거의 java로 설명이 되어 있네요.


위에서 3번째 블로그에 들어가 보았어요. (엘프녀 사진이 대문..덜덜덜)

상당히 정리가 잘되어 있는 거 같아 줄여서 인용하겠습니다.

"추상클래스는 추상메소드를 한 개 이상 포함하고 있는 클래스를 말하고, 추상메소드는 메소드의 머리(메소드의 이름,자료형,매개변수)부분만

정해놓은 것을 의미한다. "

머 아주 대충 이해는 갑니다. 그럼 추상 클래스는 어떨 때 사용하는지 살펴보면,

"여러가지 작업(기능)들을 공통된 규정(추상메소드)로 묶고 싶을 때 사용합니다."

라고 적혀있네요-_-.. 머 나 공부하려고 쓰는거니까… 온통 인용 투성이-0-;;

더더더 줄여서 말하면 추상클래스는 추상메소드를 포함하고 있는 클래스이군요! -_-;;

여기서 이런 의문이 드네요.


추상 클래스를 객체화(인스턴스화) 시킬 수 있는 것인가…


위의 질문에 대한 답을 얻기 위해선 추상 클래스를 정의하고 테스트를 해보면 되겠군요!!

C++로 해보겠습니다.


class TestAbstract

{

    bool testtest()

    {

        return false;

    }

    virtual void abstest() = 0 ; //추상메소드

};

TestAbstract * myTest =new TestAbstract();

-> error C2259: 'TestAbstract' : cannot instantiate abstract class

아래와 같은 에러가 났군요. 컴파일 에러 입니다.


다시 한번 정리하면 추상클래스는 그 자체로 객체화 시킬 수가 없군요..


그럼 인터페이스란 무엇인가!?

"인터페이스는 단일 상속의 확장성 문제를 보완하는 기능을 한다 . 인터페이스는 상수와 몸통이 없는 메소드로 구성된다. 즉 추상메소드와 상수만으로 구성된 것이 인터페이스이다. "

  • 단일 상속의 확장성 문제는 다시 알아봐야 할 듯

위의 정의를 다시 한번 단순화 + 예제화 하면 앞서 예제로 든 TestAbstract 클래스에서 bool testtest()의 정의와 구현을 빼면 인터페이스가 된단 말씀.


그렇다면 모든 인터페이스는 전부 추상 클래스라는 것과 일맥 상통.


그렇다면 차이점은 어떻게 설명해야 할까!?

으음


가만히 생각해보면 인터페이스는 메소드의 형태만 알 수 있고 실 구현은 전혀 알 수 없기 때문에 캡슐화의 정점이라 볼 수 있습니다. 그리고 또한 앞의 정의에서 언급하였듯이 단일 상속의 확장성 문제를 보완하기 위한 하나의 방법으로도 매우 중요하게 여겨지겠군요.

이런 인터페이스와 달리 추상 클래스는 그 자체가 클래스이다. 데이터 멤버도 들어 갈 수 있고 다른 클래스의 서브클래스로 만들 수도 있습니다. 하지만 그 자체로 객체화(인스턴스화) 시킬 수 없고 반드시 서브클래싱 받아 구체화 되어있지 않은 메소드를 정의해야 합니다.(이 부분은 인터페이스에도 그대로 적용됩니다.)


그렇다면 추상클래스는 인터페이스의 상위 개념인가?라는 의문도 드는데요. 그렇지는 않습니다. 인터페이스는 비객체지향적 모델 COM이나 CORBA 같은 부분에서도 사용되고 있으니까요..


단일 상속의 확장성 문제도 살펴봐야 좀 더 정확한 답이 나올 것 같아요…