private, protected 상속

Jaemyeong Lee·2024년 11월 4일
0

FastCampusC++

목록 보기
72/78

이 예제 코드와 주석을 상세히 분석하고 설명하겠습니다.

#include <iostream>
#include <deque>
#include <algorithm>

using namespace std;
  • #include <iostream>: C++ 표준 입출력 라이브러리입니다. cout을 사용하기 위해 포함합니다.
  • #include <deque>: 표준 C++ 라이브러리의 deque 컨테이너를 사용하기 위해 포함합니다.
  • #include <algorithm>: push_heappop_heap과 같은 알고리즘 함수를 사용하기 위해 포함합니다.
  • using namespace std;: std 네임스페이스를 사용하여 cout, deque 등을 간편하게 사용할 수 있게 합니다.

기본 클래스 정의

class Shape
{
};
  • class Shape: Shape라는 빈 클래스를 정의합니다. 이 클래스는 나중에 확장될 수 있지만 현재는 기능이 없습니다.

Rectangle 클래스 정의

class Rectangle : public Shape
{
};
  • class Rectangle : public Shape: Shape 클래스를 상속받아 Rectangle 클래스를 정의합니다. RectangleShape의 모든 멤버를 public으로 상속받습니다. 현재 Rectangle 클래스는 아무 멤버도 추가하지 않은 상태입니다.

설명:

  • Rectangle 클래스는 Shape와 is-a 관계입니다. 즉, RectangleShape의 한 종류입니다.

Queue0 클래스 정의

class Queue0
{
private:
    // private 상속대신에 멤버변수로 가지고 있는것이 좋다.
    deque<int> v;

public:
    void push(int value)
    {
        v.push_back(value);
    }

    void pop()
    {
        v.pop_front();
    }

    int top()
    {
        return v.front();
    }
};
  • class Queue0: Queue0 클래스는 deque<int>를 멤버 변수로 사용합니다. deque의 기능을 Queue0 클래스에서 관리합니다.
  • deque<int> v;: deque 객체 v를 private 멤버 변수로 선언합니다.
  • void push(int value): dequepush_back을 호출해 큐에 요소를 추가합니다.
  • void pop(): dequepop_front를 호출해 큐의 첫 요소를 제거합니다.
  • int top(): dequefront를 호출해 큐의 첫 요소를 반환합니다.

설명:

  • Queue0 클래스는 deque를 멤버 변수로 가지며, 큐의 기능을 구현합니다. 이는 deque를 상속받기보다는 포함하는 방식으로, 상속 대신 멤버 변수로 사용하는 것이 더 적합합니다.

Queue1 클래스 정의

class Queue1 : private deque<int>
{
public:
    void push(int value)
    {
        push_back(value);
    }

    void pop()
    {
        pop_front();
    }

    int top()
    {
        return front();
    }
};
  • class Queue1 : private deque<int>: Queue1 클래스는 deque<int>를 private 상속합니다.
  • void push(int value): dequepush_back을 호출해 큐에 요소를 추가합니다.
  • void pop(): dequepop_front를 호출해 큐의 첫 요소를 제거합니다.
  • int top(): dequefront를 호출해 큐의 첫 요소를 반환합니다.

설명:

  • Queue1 클래스는 deque<int>를 private 상속합니다. private 상속은 deque의 모든 멤버를 private으로 상속받기 때문에, 외부에서는 deque의 멤버에 접근할 수 없습니다. Queue1 클래스 내에서만 deque의 인터페이스를 사용할 수 있습니다.
  • private 상속은 deque의 protected 멤버 함수에 접근할 필요가 있거나, 상속을 통해 구현을 숨기고 싶을 때 사용합니다. 일반적으로는 잘 사용되지 않습니다.

Queue2 클래스 정의

class Queue2 : protected deque<int>
{
public:
    virtual void push(int value)
    {
        push_back(value);
    }

    virtual void pop()
    {
        pop_front();
    }

    virtual int top()
    {
        return front();
    }

    virtual ~Queue2()
    {
    }
};
  • class Queue2 : protected deque<int>: Queue2 클래스는 deque<int>를 protected 상속합니다.
  • virtual void push(int value): dequepush_back을 호출해 큐에 요소를 추가합니다.
  • virtual void pop(): dequepop_front를 호출해 큐의 첫 요소를 제거합니다.
  • virtual int top(): dequefront를 호출해 큐의 첫 요소를 반환합니다.
  • virtual ~Queue2(): 가상 소멸자입니다. 상속받는 클래스가 안전하게 소멸할 수 있도록 합니다.

설명:

  • Queue2 클래스는 deque<int>를 protected 상속합니다. protected 상속은 deque의 모든 멤버를 protected로 상속받아 자식 클래스에서 사용할 수 있도록 합니다.
  • protected 상속은 deque의 인터페이스를 자식 클래스에까지 공개할 필요가 있을 때 사용합니다. 자식 클래스에서 deque의 기능을 확장하거나 사용할 경우 유용합니다.

PriorityQueue 클래스 정의

class PriorityQueue : public Queue2
{
public:
    virtual void push(int value) override
    {
        Queue2::push(value);
        push_heap(begin(), end());
    }

    virtual void pop() override
    {
        pop_heap(begin(), end());
        Queue2::pop_back();
    }

    virtual int top() override
    {
        return front();
    }
};
  • class PriorityQueue : public Queue2: Queue2 클래스를 상속받아 PriorityQueue 클래스를 정의합니다.
  • virtual void push(int value) override: Queue2push를 호출하여 요소를 추가한 후, push_heap을 호출해 우선순위 큐의 성질을 유지합니다.
  • virtual void pop() override: pop_heap을 호출해 최상위 요소를 이동한 후, Queue2pop_back을 호출해 마지막 요소를 제거합니다.
  • virtual int top() override: front를 호출해 우선순위 큐의 최상위 요소를 반환합니다.

설명:

  • PriorityQueue 클래스는 Queue2를 상속받아 우선순위 큐의 기능을 구현합니다. push_heappop_heap 알고리즘을 사용하여 요소의 순서를 유지합니다.

main 함수

int main()
{
    PriorityQueue pq;
    pq.push(10);
    pq.push(100);
    pq.push(0);

    cout << pq.top() << endl;
    pq.pop();

    cout << pq.top() << endl;
    pq.pop();

    cout << pq.top() << endl;
    pq.pop();
}
  • PriorityQueue pq;: PriorityQueue 객체를 생성합니다.
  • pq.push(10);: 10을 우선순위 큐에 추가합니다.
  • pq.push(100);: 100을 우선순위 큐에 추가합니다.
  • pq.push(0);: 0을 우선순위 큐에 추가합니다.
  • cout << pq.top() << endl;: 최상위 요소를 출력합니다.
  • pq.pop();: 최상위 요소를 제거합니다.
  • 이 과정을 반복하여 큐의 모든 요소를 제거하고 출력합니다.

요약

  • Queue0: deque를 멤버 변수로 사용하여 큐의 기능을 구현합니다. 포함(has-a) 관계입니다.
  • Queue1: deque를 private 상속하여 인터페이스를 숨깁니다. private 상속은 외부에서 deque의 멤버에 접근할 수 없습니다.
  • Queue2: deque를 protected 상속하여 자식 클래스에서 사용할 수 있도록 합니다. protected 상속은 자식 클래스에 기능을 공개할 때 유용합니다.
  • PriorityQueue: Queue2를 상속받아 우선순위 큐의 기능을 구현합니다. push_heappop_heap을 사용하여 요소의 우선순위를 유지합니다.
profile
李家네_공부방

0개의 댓글