C & C++/디딤돌 C++

[C++] 62. 집합(AGGREGATION) 관계

언휴 2024. 4. 13. 15:28

 

[C++] 집합(AGGREGATION) 관계

집합 관계는 개체를 보관하는 컬렉션과 개체 사이의 관계입니다.

집합 관계 클래스 다이어그램

“필통은 연필을 보관할 수 있다.” 처럼 컬렉션 필통과 보관할 연필 사이의 관계입니다. 전산에서 자료구조라고 말하는 컬렉션과 컬렉션에 보관할 개체 사이의 관계입니다.

집합 관계와 구성 관계는 “가지고 있다.” 혹은 “가질 수 있다.”로 표현할 수 있고 영어로 “Has a”로 표현할 수 있어서 “Has a”관계라고도 부릅니다.

집합 관계는 컬렉션과 보관할 개체의 생성과 소멸은 독립적입니다. 참고로 구성 관계는 사람과 눈처럼 소유 개체를 생성할 때 피 소유 개체가 만들어지고 소유 개체가 소멸할 때 피 소유 개체도 같이 해제하는 특징을 갖습니다. 다음은 집합 관계에 있는 Pencil과 PencilCase를 구현한 예제 코드입니다.

//Pencil.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Pencil
{
    string company;
    int price;    
public:
    Pencil(string company,int price);
    string GetCompany()const;
    int GetPrice()const;
};
//Pencil.cpp
#include "Pencil.h"

Pencil::Pencil(string company,int price)
{
    this->company = company;
    this->price = price;
}
string Pencil::GetCompany()const
{
    return company;
}
int Pencil::GetPrice()const
{
    return price;
}
//PencilCase.h
#pragma once
#include "Pencil.h"
class PencilCase
{
    Pencil **base;
    const size_t capacity;
    size_t count;
public:
    PencilCase(size_t capacity);
    ~PencilCase(void);
    bool PushBack(Pencil *pencil);
    void List()const;
    size_t GetCount()const;
    Pencil *&operator[](size_t index);
};
//PencilCase.cpp
#include "PencilCase.h"
#include <iomanip>
using namespace std;
PencilCase::PencilCase(size_t capacity):capacity(capacity)
{
    base = new Pencil *[capacity];
    count = 0;
}
PencilCase::~PencilCase(void)
{
    delete[] base;
}
bool PencilCase::PushBack(Pencil *pencil)
{
    if(count<capacity)
    {
        base[count] = pencil;
        count++;
        return true;
    }
    return false;
}

void PencilCase::List()const
{
    //left:왼쪽 정렬, right:오른쪽 정렬, setw(n):폭을 n으로 설정
    cout<<left<<setw(10)<<"회사"<<right<<setw(5)<<"가격"<<endl;
    for(size_t i = 0; i<count; i++)
    {
        cout<<left<<setw(10)<<base[i]->GetCompany();
        cout<<right<<setw(5)<<base[i]->GetPrice()<<endl;
    }
}

size_t PencilCase::GetCount()const
{
    return count;
}

Pencil *&PencilCase::operator[](size_t index)
{
    if((index<0)||(index>=count))
    {
        throw "인덱스가 범위를 벗어났습니다.";
    }
    return base[index];
}
//Program.cpp
#include "PencilCase.h"
int main()
{    
    PencilCase pc(10);

    pc.PushBack(new Pencil("연필좋아",1000));
    pc.PushBack(new Pencil("연필나라",1200));
    pc.PushBack(new Pencil("연필좋아",1400));
    pc.PushBack(new Pencil("연필나라",1200));
    pc.PushBack(new Pencil("연필나라",1600));
    pc.PushBack(new Pencil("연필좋아",1100));
    pc.PushBack(new Pencil("연필나라",1300));
    pc.PushBack(new Pencil("연필좋아",1500));
    pc.PushBack(new Pencil("연필좋아",500));
    pc.List();

    size_t count = pc.GetCount();
    for(size_t i=0; i<count;i++)
    {
        delete pc[i];
    }
    
    return 0;
}

▷ 실행 결과

회사       가격
연필좋아   1000
연필나라   1200
연필좋아   1400
연필나라   1200
연필나라   1600
연필좋아   1100
연필나라   1300
연필좋아   1500
연필좋아    500