Game !
C++

[C++] interface2022. 5. 6. 06:51

 


interface

특정 기능을 구현할 것을 약속한 추상 형식
( 다형성 의도를 명확하게 표현하기 위해 약속된 문법.. 이라고 생각할 수 있다 )

특정 기능을 약속한 함수만 갖는다. 즉, 멤버 변수나 구체적으로 구현된 함수를 갖지 않는다.
모든 멤버 함수는 public 으로만 사용된다.

인터페이스로 사용한다 라고 가독성을 높이기 위해 인터페이스의 이름은 I 로 시작하도록 약속되어있다.

interface 는 그 자체로 객체를 생성할 수 없고,
해당 인터페이스를 상속받아 무조건 재정의해서 사용하도록 의도한다.


기존에는 별도로 C++ 에서 문법을 제공하지 않았기 때문에
구조체 또는 클래스로 인터페이스를 만들어서 사용했다.

#define interface class

interface IAnimal
{
public: 
     virtual void Sound( ) = 0;
}

class Cat : public IAnimal
{
private:
     string name;
public:
     Cat( ) { }
     virtual void Sound( )
     {
          cout << Meow~ << endl;
     }
}

void OnAnimalSound( IAnimal* iAnimal )
{
     iAnimal->Sound( );
}

void main( )
{
     Cat* _cat = new Cat( );
     OnAnimalSound( _cat );
   
     delete _cat;
}


interface 를 사용할 때 주의해야할 점

소멸자는 순수 가상함수로 선언할 수 없다.
즉, interface 내부에 소멸자를 선언하지 않는다는 것..

부모 자료형에 자식 객체를 생성했을 경우, 메모리 해제 시 자식 클래스의 메모리도 같이 해제할 수 있도록 해야한다.
즉, interface 를 상속받는 클래스가 추상 클래스가 될 경우, 가상 소멸자를 꼭 구현해주어야한다.

* 추상 클래스 : 하나 이상의 순수 가상 함수를 포함하는 클래스

interface IAnimal
{
public:
     virtual void Sound( ) = 0;
}

// abstract 키워드를 붙임으로써, 추상 클래스라고 명시적으로 표기한다.
class Pet abstract : public IAnimal
{
private:
     string name;
public:
     Pet( string _name ) {  name = _name;  }
     virtual ~Pet( );
     void ChangeName( string _name );
}

class Cat : public Pet
{
public:
     Cat( );
     ~Cat( );
     virtual void Sound( ) {  cout << " Meow~" <<endl;  }
}

void main( )
{
     Pet* pPet = new Cat( "Yuumi" );

     delete pPet;
     pPet = nullptr;
}


Pet* pPet = new Cat( "Yuumi" ); 에서...
Pet 클래스의 포인터로 참조하지만, 생성되는 객체는 Cat 클래스의 객체이다.
Pet 클래스의 생성자와 Cat 클래스의 생성자에서는 메모리 공간이 동적할당 되는데에 문제가 없다.

하지만 만약 위 예제에서 가상 소멸자가 아닌, 일반 소멸자로 구현했을 경우 ( ex. ~Pet( ) )
delete pPet; 으로 메모리 해제 시.. 자료형이 Pet 이므로, Pet 의 소멸자만 호출된다.
---> 자식 메모리가 해제되지 않음으로써 메모리 유출이 발생하게 된다.

virtual 소멸자로 구현했을 경우,
delete pPet; 에서
Pet 클래스를 상속받고 있는 Cat 소멸자가 호출된다. ( virtual 로 자식 소멸자가 호출됨 )
이어서 Cat 소멸자가 Pet 을 상속받고 있으므로, Pet 의 소멸자를 호출하게 된다.
> 정상적인 처리로 메모리가 깔끔하게 정리된다.


cf.
다형성으로 사용되는 기본 클래스의 경우, 반드시 virtual 소멸자를 사용하도록 하자.

 


__interface

C++ 에서 제공하는 인터페이스 키워드
class 키워드 없이 독립적으로 사용된다


__interface IAnimal
{
     void Sound( );     // 자동으로 순수 가상 함수로 취급된다.
}


C# 의 interface 기능과 의미가 동일하다

 

 

'C++' 카테고리의 다른 글

[C++] C++ 스타일 파일입출력  (0) 2022.11.12
[C++] 코드 위치나 정보를 받아오는 매크로 들  (0) 2022.05.08
[C++] 함수 포인터  (0) 2022.05.06
[C++] 문법 - 범위 지정 연산자  (0) 2022.04.01
C++ for_each 함수  (0) 2018.03.21