이 예제 코드와 주석을 상세히 분석하고 설명하겠습니다.
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;
#include <iostream>
: C++ 표준 입출력 라이브러리입니다. cout
을 사용하기 위해 포함합니다.#include <deque>
: 표준 C++ 라이브러리의 deque
컨테이너를 사용하기 위해 포함합니다.#include <algorithm>
: push_heap
및 pop_heap
과 같은 알고리즘 함수를 사용하기 위해 포함합니다.using namespace std;
: std
네임스페이스를 사용하여 cout
, deque
등을 간편하게 사용할 수 있게 합니다.class Shape
{
};
class Shape
: Shape
라는 빈 클래스를 정의합니다. 이 클래스는 나중에 확장될 수 있지만 현재는 기능이 없습니다.class Rectangle : public Shape
{
};
class Rectangle : public Shape
: Shape
클래스를 상속받아 Rectangle
클래스를 정의합니다. Rectangle
은 Shape
의 모든 멤버를 public
으로 상속받습니다. 현재 Rectangle
클래스는 아무 멤버도 추가하지 않은 상태입니다.설명:
Rectangle
클래스는 Shape
와 is-a 관계입니다. 즉, Rectangle
은 Shape
의 한 종류입니다.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)
: deque
의 push_back
을 호출해 큐에 요소를 추가합니다.void pop()
: deque
의 pop_front
를 호출해 큐의 첫 요소를 제거합니다.int top()
: deque
의 front
를 호출해 큐의 첫 요소를 반환합니다.설명:
Queue0
클래스는 deque
를 멤버 변수로 가지며, 큐의 기능을 구현합니다. 이는 deque
를 상속받기보다는 포함하는 방식으로, 상속 대신 멤버 변수로 사용하는 것이 더 적합합니다.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)
: deque
의 push_back
을 호출해 큐에 요소를 추가합니다.void pop()
: deque
의 pop_front
를 호출해 큐의 첫 요소를 제거합니다.int top()
: deque
의 front
를 호출해 큐의 첫 요소를 반환합니다.설명:
Queue1
클래스는 deque<int>
를 private 상속합니다. private
상속은 deque
의 모든 멤버를 private
으로 상속받기 때문에, 외부에서는 deque
의 멤버에 접근할 수 없습니다. Queue1
클래스 내에서만 deque
의 인터페이스를 사용할 수 있습니다.private
상속은 deque
의 protected 멤버 함수에 접근할 필요가 있거나, 상속을 통해 구현을 숨기고 싶을 때 사용합니다. 일반적으로는 잘 사용되지 않습니다.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)
: deque
의 push_back
을 호출해 큐에 요소를 추가합니다.virtual void pop()
: deque
의 pop_front
를 호출해 큐의 첫 요소를 제거합니다.virtual int top()
: deque
의 front
를 호출해 큐의 첫 요소를 반환합니다.virtual ~Queue2()
: 가상 소멸자입니다. 상속받는 클래스가 안전하게 소멸할 수 있도록 합니다.설명:
Queue2
클래스는 deque<int>
를 protected 상속합니다. protected
상속은 deque
의 모든 멤버를 protected
로 상속받아 자식 클래스에서 사용할 수 있도록 합니다.protected
상속은 deque
의 인터페이스를 자식 클래스에까지 공개할 필요가 있을 때 사용합니다. 자식 클래스에서 deque
의 기능을 확장하거나 사용할 경우 유용합니다.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
: Queue2
의 push
를 호출하여 요소를 추가한 후, push_heap
을 호출해 우선순위 큐의 성질을 유지합니다.virtual void pop() override
: pop_heap
을 호출해 최상위 요소를 이동한 후, Queue2
의 pop_back
을 호출해 마지막 요소를 제거합니다.virtual int top() override
: front
를 호출해 우선순위 큐의 최상위 요소를 반환합니다.설명:
PriorityQueue
클래스는 Queue2
를 상속받아 우선순위 큐의 기능을 구현합니다. push_heap
과 pop_heap
알고리즘을 사용하여 요소의 순서를 유지합니다.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_heap
과 pop_heap
을 사용하여 요소의 우선순위를 유지합니다.