본문 바로가기
VisualStudio.C++.C#/코딩팁,함수활용,단편

C++ 클래스. 인터페이스 클래스. interface.

by 리치굿맨 2017. 6. 25.


 

개요

 


인터페이스 클래스

정의 : 소멸자와 순수가상함수만 선언된 클래스.


( 순수가상함수, 추상클래스등의 기본 개념 보기 -> http://igotit.tistory.com/1325 )


 

인터페이스 클래스 예.


class ImyClass {


public:

 virtual ~myClass() ;  //소멸자. 꼭 선언하지 않아도 됨.

 virtual void myFunc1() = 0 ;  // 순수가상함수.

 virtual void myFunc2() = 0 ;  // 순수가상함수.

};



동영상. 

- 클래스위저드로 클래스 자동생성하여 생성자 제거하고 순수가상함수만 추가하면된다.





Visual C++ 에서 제공되는 interface 자료형.


Visual C++ 에서는 인터페이스 클래스 용도로 사용하기 위한 interface 자료형이 제공되는데, 전혀 특별한 것이 아닌 일반 struct 형과 동일한것. 즉, 헤더파일 combaseapi.h 에 아래처럼 struct 를 재정의한 것일뿐이다.인터페이스로 선언되었음을 명시적으로 보이게 하기 위함이 전부이다.



 

interface 로 선언하면,


interface ImyClass {


public:

 virtual ~myClass() ;  //소멸자.

 virtual void myFunc1() = 0 ;  // 순수가상함수.

 virtual void myFunc2() = 0 ;  // 순수가상함수.

};



즉, class, struct, interface 뭘로 선언하든 순수가상함수들로만 구성되어있다면 작용은 동일하다.

기타 : 통상 인터페이스 로 정의될때 코드 가독성 위해 명칭에 I 부착한다. 


interface 로 선언한 경우 Visual Studio 에서는 class와는 다른 시각적 표현을 보여준다. (아래 그림)


Visual Studio 에서 제공하는 클래스 다이아그램 에서도 interface 표현은 아래 그림처럼 일반클래스와는 다르게 처리된다.

interface자체는 녹색박스로 표현되면,

interface 를 base class 로 하는 derived class 에는 동그라미 가 부착된다.(붉은 박스부분)



 


 

 

interface 클래스 주요 활용 특징.

   

요점 : 순수가상함수 성질  AND 클래스 상속 특징에 기반한 활용특징이 전부.


1. 순수가상함수로만 구성된 클래스이므로 스스로는 인스턴스 생성 불가. base 클래스로만 사용되어 상속클래스 만들때 만 사용가능.

2. derived class 에서는 interface 에서 선언한 순수가상함수 구현 필수.


예 : ImyClass 를 base 클래스로 하는 myClass2

 


class myclass2 : public ImyClass

{

 void myFunc1(){ .... ; }; // ImyClass 에서 선언해둔 순수가상함수 구현 필수.

 void myFunc2(){ .... ; }; // ImyClass 에서 선언해둔 순수가상함수 구현 필수.


};



3. 함수인자로 (ImyClass * p_imyclass) 로 interface 개체 포인터를 받도록 하고, derived class 개체 포인터 전달 가능.

4. 상기3의 p_imyclass->muFunc1() 호출하면 실제 실행되는것은 myclass2의 myFunc1() 이 실행됨.


예. myclass3 에서 interface 개체포인터로 함수 myFunc1()호출하면 myclass2 (ImyClass 에서 상속된) 의 myFunc1() 실행됨.

- 이점 : myclass2와 myclass3 .사이의  코드 결합이 강하지 않으면서 단일 interface  경유하여 접근가능. (참고:  본 성질은 base 클래스를  추상클래스 로 해도 동일함. )


 myclass2

 myclass3 

 

class myclass2 : public ImyClass

{

 void myFunc1(){ .... ; }; // 함수 구현 필수.

 void myFunc2(){ .... ; }; // 함수 구현 필수.


 myclass3 obj_class3;

  

 void func()

 {

   obj_class3.class3_func1(this);

 };

};

class myclass3

{


  void class3_func1(ImyClass * p_imyclass)

  {

    p_imyclass->myFunc1(); // myclass2의 myFunc1()이 실행됨.

  };

}

 


 





첫등록 : 2017년 6월 25일.

최종수정 : 


본 글 단축주소 : https://igotit.tistory.com/1331





댓글0


   
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     선물 인버스 |선물 USDT