[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 |