본문 바로가기
Programming/Code Challenge

[C++ HackerRank 코드 챌린지] Day 13: Abstract Classes (추상)

by 항공학도 2020. 5. 17.

계속해서 HackerRank 30 days of code에 속한 문제중 Day 13: Abstract Classes (추상)에 관해 풀어보도록 하겠습니다.

저의 코드는 github에 올려 두었으니 참고하시면 좋겠습니다. 이 글에서 설명되는 문법에 대한 내용은 TCP School의 문서를 참고하였습니다.

이번 문제는 Day 12: Inheritance (상속) 문제를 확장해서 푸는 문제입니다. 추상 클래스는 매우 구체적인 객체 지향 개념이기 때문에 이 구문을 사용하는 언어는 그렇게 많지 않다고 하네요. 일단 c++로 문제가 구현이 되어 있기에 풀어보겠습니다. 문제는 다음과 같습니다.

Book 클래스가 주어져있고, 다음을 만족하는  MyBook 클래스를 작성하면 됩니다.

1. Book의 속성을 상속할것

2. string title, string author, int price를 파라미터로 가질것

3. Book 클래스의 추상 display() method를 구현하여 Title, Author, Price를 print한다.

먼저 Book 클래스는 다음과 같이 선언되어 있습니다. 

class Book{
    protected:
        string title;
        string author;
    public:
        Book(string t,string a){
            title=t;
            author=a;
        }
        virtual void display()=0;

};

여기에서 

virtual void display()=0;

이 부분은 pure virtual function(순수 가상 함수)로 derived 클래스에서 재정의할 것으로 기대하는 멤버 함수를 의미합니다. 함수만 있고 본체가 없다는 의미로 끝에 "=0"을 추가합니다. 이렇게 순수 가상함수를 포함하는 클래스를 abstract class라고 합니다.

먼저 1과 2의 조건에 따라 MyBook클래스에서 string title, string author, int price를 파라미터를 가지기 위해서는 Book 클래스의 title, author를 상속받고, int형 price만 추가로 선언하면 됩니다. 따라서, MyBook 클래스는 우선 다음과 같이 작성합니다.

class MyBook : public Book{
 
    public:
    int price;
    MyBook(string title, string author, int price):Book(title, author){
        this->title = title;
        this->author = author;
        this->price = price;
    }
...

여기에다가 Book 클래스의 pure virtual function인 display를 구현하여 Title, author, price를 print하는 함수는 다음과 같이 작성할 수 있습니다.

    virtual void display(){
        cout << "Title: " << title<<endl;
        cout << "Author: " << author<<endl;
        cout << "Price: " << price<<endl;
    }

이에따라 최종 작성이 완료된 MyBook 클래스는 다음과 같습니다.

class MyBook : public Book{
 
    public:
    int price;
    MyBook(string title, string author, int price):Book(title, author){
        this->title = title;
        this->author = author;
        this->price = price;
    }

    virtual void display(){
        cout << "Title: " << title<<endl;
        cout << "Author: " << author<<endl;
        cout << "Price: " << price<<endl;
    }
};

main함수는 다음과 같이 작성되어 있습니다. Mybook클래스를 novel로 선언하고 novel.display();로 print를 하는 것을 확인할 수 있습니다.

int main() {
    string title,author;
    int price;
    getline(cin,title);
    getline(cin,author);
    cin>>price;
    MyBook novel(title,author,price);
    novel.display();
    return 0;
}

 

댓글