[디딤돌 C++] 65. 연관(ASSOCIATION) 관계

연관 관계는 명령 개체와 피 명령 개체가 명확하지 않은 관계입니다. 프로그램에서는 연관 관계로 표현하지 말고 직접 연관 관계로 표현하는 것이 안전합니다.

연관 관계는 약사와 의사처럼 “약사와 의사는 환자 치료에 연관이 있다.”와 같이 수평적인 관계입니다. 의사는 환자 치료를 위해 어떠한 약을 처방받아 먹고 있는지 알 수 있어야 합니다. 또한 약사는 약을 조재하기 위해서는 의사의 처방이 필요합니다.

그런데 이와 같은 관계에서 프로그램을 잘못 작성하여 버그가 날 위험이 많습니다. 예를 들어 의사의 “치료하다” 기능에서 약사의 “조재하다”를 호출하게 구현하고 약사의 “조재하다” 기능에서 의사의 “치료하다”를 호출한다면 스택 오버 플로우가 발생할 것입니다.

물론 주의하여 작성한다면 버그를 피하거나 버그 발생한 것을 수정할 수 있습니다. 하지만 프로그램의 규모가 커질수록 이러한 관계로 인한 버그를 잡는 것은 구조적으로 안전한 직접 연관 관계로 표현하는 것보다 많은 비용이 들 확률이 더 높습니다.

다음은 의사와 약사 사이의 연관 관계를 표현한 코드입니다.

//Doctor.h
#pragma once
#include <iostream>
using std::cout;
using std::endl;
class Druggist;
class Doctor
{
public: 
    void Treatment(Druggist *dru);
    void Treatment();
};
//Doctor.cpp
#include "Doctor.h"
#include "Druggist.h"
void Doctor::Treatment(Druggist *dru)
{
    Treatment();
    dru->Hasty();
}
void Doctor::Treatment()
{
    cout<<"치료하다."<<endl;
}
//Druggist.h
#pragma once
class Doctor;
class Druggist
{
public:
    void Hasty(Doctor *doc);
    void Hasty();
};
//Druggist.cpp
#include "Druggist.h"
#include "Doctor.h"
void Druggist::Hasty(Doctor *doc)
{
    Hasty();
    doc->Treatment();
}
void Druggist::Hasty()
{
    cout<<"조재하다."<<endl;
}
//Program.cpp
#include "Doctor.h"
#include "Druggist.h"
int main()
{
    Doctor *doc = new Doctor();
    Druggist *dru = new Druggist();

    cout<<"Test1"<<endl;
    doc->Treatment(dru);
    cout<<"Test2"<<endl;
    dru->Hasty(doc);

    delete doc;
    delete dru;
    return 0;
}

▷ 실행 결과

Test1
치료하다.
조재하다.
Test2
조재하다.
치료하다.