4. 4 의존 관계 (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에서 주문한 제품을 소멸하지 않아도 공장 소멸자 메서드가 수행하면서 자신이 생성했던 개체를 소멸하는 책임을 다하는 것을 확인할 수 있습니다.
(모든 동영상 강의는 무료입니다.)
'언어 자료구조 알고리즘 > Escort C++' 카테고리의 다른 글
[C++] 무효화 된 멤버 사용하기 (0) | 2016.04.15 |
---|---|
[C++] 무효화 (0) | 2016.04.15 |
[C++] 파생 개체 생성 과정 및 초기화 (0) | 2016.04.15 |
[C++] 일반화 관계와 파생 (0) | 2016.04.15 |
[C++] 실현관계 (Realization) (0) | 2016.04.15 |
[C++] 연관(Association) 관계와 직접 연관(Directed Association) 관계 (0) | 2016.04.15 |
[C++] 집합(Aggregation)관계와 구성(Composition) 관계 (0) | 2016.04.15 |
[C++} 4. 1 일반화 (Generalization) 관계 (0) | 2016.04.15 |
[C++] 캡슐화 실습 소스 코드 (0) | 2016.04.15 |
[C++] 캡슐화 실습 - 멤버 메서드 구현 (0) | 2016.04.15 |