언어 자료구조 알고리즘/Escort C++

[C++] 연관(Association) 관계와 직접 연관(Directed Association) 관계

언제나휴일 2016. 4. 15. 13:50
반응형

4. 3 연관(Association)와 직접 연관(Directed Association)

 

 약사와 의사처럼 "약사와 의사는 환자 치료에 연관이 있다."와 같이 수평적인 관계를 연관 관계라 한다.


연관(Association) 관계

[그림 4.6]

 

 예제에서는 의사가 먼저 치료하고 약사가 조재하거나 약사가 먼저 조재하고 의사가 치료하는 예를 들어보도록 하겠습니다. 의사에게 먼저 치료를 수행시킬 때 약사를 입력 인자로 전달하면 치료를 하는 멤버 메서드에서 약사의 조재하다를 호출하면 사용자는 의사의 치료하다만 호출하더라도 자동으로 약사의 조재하다도 수행되게 됩니다.

 

 이처럼 하나의 개체의 메서드에 다른 개체를 인자로 넘기고 인자로 받은 개체의 메서드를 호출해야 수행되는 것을 더블 디스패치라고 합니다이처럼 특정 목적을 수행하기 위해 더블 디스패치를 사용을 할 경우 연관 관계를 사용하게 됩니다. 하지만 서로 계속 호출하여 스택 오버플로우 나는 상황이 발생할 수 있으니 주의하시기 바랍니다.

 

Doctor.h

#pragma once

 

#include <iostream>

using std::cout;

using std::endl;

 

class Druggist;

class Doctor

{

public:

    Doctor(void);

    virtual ~Doctor(void);

    void Treatment(Druggist *dru);

    void Treatment();

};

 

 

Doctor.cpp

#include "Doctor.h"

#include "Druggist.h"

 

Doctor::Doctor(void)

{

}

 

Doctor::~Doctor(void)

{

}

void Doctor::Treatment(Druggist *dru)

{

    Treatment();

    dru->Hasty();

}

 

void Doctor::Treatment()

{

    cout<<"치료하다."<<endl;

}

 

Druggist.h

#pragma once

 

class Doctor;

class Druggist

{

public:

    Druggist(void);

    ~Druggist(void);

    void Hasty(Doctor *doc);

    void Hasty();

};

 

 

Druggist.cpp

#include "Druggist.h"

#include "Doctor.h"

 

Druggist::Druggist(void)

{

}

Druggist::~Druggist(void)

{

}

void Druggist::Hasty(Doctor *doc)

{

    Hasty();

    doc->Treatment();

}

void Druggist::Hasty()

{

    cout<<"조재하다."<<endl;

}

 

Test.cpp

#include "Doctor.h"

#include "Druggist.h"

void 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;

}

 

 

 이번에는 직접 연관 관계에 대해 살펴보기로 합시다.

 

 고용인과 피고용인처럼 "고용인은 피고용인에게 업무를 지시하다." 와 같이 수직적인 관계를 직접 연관 관계라 한다.  


직접 연관(Directed Association) 관계

 [그림 4.7] *그림이 반대로 그려졌네요.*

 

Employee.h

#pragma once

#include "Employer.h"

class Employee

{

public:

    Employee(void);

    ~Employee(void);

    void CommandJob(Employer *employer);

};

 

 

Employee.cpp

#include "Employee.h"

 

Employee::Employee(void)

{

}

Employee::~Employee(void)

{

}

void Employee::CommandJob(Employer *employer)

{

    cout<<"일을 지시하다."<<endl;

    employer->DoJob();

}

 

Employer.h

#pragma once

#include <iostream>

using std::cout;

using std::endl;

class Employer

{

public:

    Employer(void);

    ~Employer(void);

    void DoJob();

};

 

 

Employer.cpp

#include "Employer.h"

Employer::Employer(void)

{

}

Employer::~Employer(void)

{

}

void Employer::DoJob()

{

    cout<<"일을 수행하다."<<endl;

}

 

Test.cpp

#include "Employee.h"

void main()

{

    Employee *employee = new Employee();

    Employer *employer = new Employer();

    employee->CommandJob(employer);

    delete employer;

    delete employee;

}

 

4장 클래스 간의 관계

(모든 동영상 강의는 무료입니다.)

반응형