abstract classes and interfaces __ 추상클래스와 인터페이스

😎·2022년 12월 26일
0

CPP

목록 보기
27/46

abstract classes and interfaces

abstarct classes __ 추상클래스

추상 클래스란 뭘까? 특징은 다음과 같다.

  1. 객체로 만들지 못하고 상속으로만 사용한다.
  2. 추상클래스를 상속 받은 자식은 순수 가상 함수를 무조건 오버라이딩해야한다.

말 그대로 추상클래스는 인스턴스화가 불가능하다. 그렇다면 어떤 걸 보고 추상클래스인지 아닌지 알 수 있을까? 추상클래스는 순수 가상 함수를 갖고 있다. 멤버 함수 앞과 뒤에 virtual= 0 가 있다면 순수 가상 함수이다.

virtual void attack(std::string const &target) = 0;

1. 객체로 만들지 못하고 상속으로만 사용한다.

class ACharacter {
    public:
     virtual void attack(std::string const &target) = 0;
     void         sayHello(std::string const &target);
};

class Warrior : public ACharacter {
    public:
     virtual void attack(std::string const &target);
};

void    ACharacter::sayHello(std::string const &target) {
     std::cout << "Hello" << target << " !" << std::endl;
}

void    Warrior::attack(std::string const &target) {
     std::cout << "attacks " << target << " with a sword" << std::endl;
}

int main() {
    ACharacter* a = new ACharacter();

    a->sayHello("students");
    a->attack("roger");
}

2. 추상클래스를 상속 받은 자식은 순수 가상 함수를 무조건 오버라이딩해야한다.

다음과 같이 순수 가상 함수를 자식에서 오버라이딩하지 않으면 컴파일 되지 않는다.

#include <string>
#include <iostream>

class ACharacter {
    public:
     virtual void attack(std::string const &target) = 0;
     void         sayHello(std::string const &target);
};

class Warrior : public ACharacter {
    public:

};

void    ACharacter::sayHello(std::string const &target) {
     std::cout << "Hello" << target << " !" << std::endl;
}

int main() {
    ACharacter* a = new Warrior();

    a->sayHello("students");
}


interfaces __ 인터페이스

인터페이스는 순수 가상 함수로만 이루어진 클래스를 의미한다.

class ICoffeeMaker {
    public:
     virtual void fillWaterTank(IWaterSource *src) = 0;
     virtual ICoffee* makeCoffee(IWaterSource *src) = 0;
};

만약 ACharacter 를 인터페이스로 만들고 싶다면, sayHello 함수를 없애면 된다.

class ACharacter {
    public:
     virtual void attack(std::string const &target) = 0;
};

TIP

  • 추상클래스는 클래스 앞에 A 를 붙여보자. ex. ACharacter
  • 인터페이스는 클래스 앞에 I 를 붙여보자. ex. ICoffeeMaker
  • #define interface ~~~ 를 이용해보자 C++언어에서는 구조체는 디폴트 가시성이 public이어서 구조체를 이용하여 인터페이스를 정의하기도 한다.
    #define interface struct
    interface IPlay //구조체는 디폴트 가시성
    {
        virtual void Play()=0;
    };
    
    물론 class를 이용하여 인터페이스를 만들 수도 있다.
    #define interface class
    interface IPlay
    {
    public:
        virtual void Play()=0;
    };

참고 자료

profile
jaekim

0개의 댓글