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

[C++] 의존 관계 (Dependency)

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

4. 4 의존 관계 (Dependency)

 

  학생과 시험에서처럼 "학생의 성적은 시험 문제의 난이도에 영향을 받는다." 와 같이 특정 개체에 따라 특정 행위에 영향이 생기는 관계를 얘기합니다. 그리고 공장과 상품처럼 "공장에 상품을 주문하면 상품을 생산한다." 와 같이 특정 형식의 개체 생성을 책임질 때에도 의존 관계로 표시합니다.



의존 관계 (Dependency)

  [그림 4.8]

 

 먼저, 학생이 시험을 보았을 때 성적이 시험의 난이도에 영향을 받는 경우의 예제 코드를 살펴봅시다.

 

Stu.h

#pragma once

#include "Examination.h"

 

#include <string>

using std::string;

 

class Stu

{

    string name;

    int score;

public:

    Stu(string _name);

    ~Stu(void);

    void TestAnExamination(Examination *ex);

    int GetScore()const;

};

 

  

Stu.cpp

#include "Stu.h"

 

Stu::Stu(string _name)

{

    name = name;

    score = -1;

}

 

Stu::~Stu(void)

{

}

void Stu::TestAnExamination(Examination *ex)

{

    score = 100 - (10 * ex->GetDifficult());

}

 

int Stu::GetScore()const

{

    return score;

}

 

Examination.h

#pragma once

 

class Examination

{

    int difficult;

public:

    Examination(int _difficult);

    ~Examination(void);

    int GetDifficult()const;

};

 

 

Examinatio.cpp

#include "Examination.h"

Examination::Examination(int _difficult)

{

    difficult = _difficult;

}

Examination::~Examination(void)

{

}

int Examination::GetDifficult()const

{

    return difficult;

}

 

Test.cpp

#include "Stu.h"

#include <iostream>

using std::cout;

using std::endl;

void main()

{

    Stu *stu = new Stu("홍길동");

    Examination *ex = new Examination(3);

    stu->TestAnExamination(ex);

    cout<<"난이도:"<<ex->GetDifficult()<<endl;

    cout<<"성적:"<<stu->GetScore()<<endl;

    delete ex;

 

    Examination *ex2 = new Examination(5);

    stu->TestAnExamination(ex2);

    cout<<"난이도:"<<ex2->GetDifficult()<<endl;

    cout<<"성적:"<<stu->GetScore()<<endl;

    delete ex2;

    delete stu;

}

 

  

 다음은 공장에서 제품을 주문하는 예제 코드를 살펴봅시다.

 

 공장에서는 제품을 주문 생산을 하는데 이와 같은 관계가 있을 때 제품을 생성한 공장에서 소멸을 시키면 좀 더 신뢰성 있는 코드를 작성하실 수 있습니다. 그리고 생성에 대한 부분은 GoF의 디자인 패턴을 보면 5가지의 생성 패턴들을 제시하고 있습니다. 여러분이 C++문법 및 구현 능력을 키우고 나서 설계 능력을 키우기 위한 학습을 하십시오. 이번 장에서는 Factory에서 생성한 제품 개체들을 Factory 소멸자에서 책임을 지는 부분만 다루기로 하고 설계 패턴에 대해서는 논하지 않기로 하겠습니다.

 

Factory.h

#pragma once

 

#include "Product.h"

 

#define MAX_PRODUCTS      10

 

class Factory

{

    Product *products[MAX_PRODUCTS];

    int sellcnt;

public:

    Factory(void);

    ~Factory(void);

    Product *Order();

};

 

  

Factory.cpp

#include "Factory.h"

 

Factory::Factory(void)

{

    cout<<"공장 생성자 메서드"<<endl;

    sellcnt = 0;

}

 

Factory::~Factory(void)

{

    cout<<"공장 소멸자 메서드"<<endl;

    for(int i = 0; i < sellcnt ; i++)

    {

        delete products[i];

    }

}

Product *Factory::Order()

{

    Product *product  = new Product();

    products[sellcnt] = product;

    sellcnt++;

    return product;

}

 

 

Product.h

#pragma once

#include <iostream>

using std::cout;

using std::endl;

class Product

{

public:

    Product(void);

    ~Product(void);

};

 

Product.cpp

#include "Product.h"

 

Product::Product(void)

{

    cout<<"제품 생성자 메서드"<<endl;

}

 

Product::~Product(void)

{

    cout<<"제품 소멸 메서드"<<endl;

}

 

 

Test.cpp

#include "Factory.h"

 

void main()

{

    Factory *factory = new Factory();

    Product *product = factory->Order();

    Product *product2 = factory->Order();

    delete factory;

}


[그림 4.9]

 

 [그림 4.9]를 보시면 main에서 주문한 제품을 소멸하지 않아도 공장 소멸자 메서드가 수행하면서 자신이 생성했던 개체를 소멸하는 책임을 다하는 것을 확인할 수 있습니다.


4장 클래스 간의 관계

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

반응형