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

[C++] 상세 설계 및 구현, 클래스 추가 및 관계에 따른 헤더 포함

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

10.5 상세 설계 및 구현

 

 여기에서는 지금까지 진행한 작업을 기반으로 어떻게 프로그램 코드로 변환하는지와 나머지 상세 구현 및 구체적 기능 구현에 대해 다루도록 하겠습니다. 제일 먼저, 클래스 다이어그램을 기반으로 프로젝트에 클래스를 추가하고 관계에 따라 헤더를 포함하는 구문을 넣을 것입니다. 그리고 시퀀스 다이어그램을 보면서 메시지를 수신하는 클래스에 public 멤버 메서드들을 추가하고 가상 메서드인지 추상 메서드 인지 등을 결정할 것입니다. 이 작업이 완료되면 시나리오와 시퀀스 다이어그램을 보면서 상세 설계 및 구현을 해 나가겠습니다.

 

10.5.1 클래스 추가 및 관계에 따른 헤더 포함

 

 제일 먼저 프로젝트를 생성을 하십시오. 그리고 프로젝트를 생성하였으면 제일 먼저 진입점인 main이 있는 Program.cpp를 추가하도록 합시다.

 

Program.cpp

void main()

{

}

 

 앞으로 프로그램에 무엇인가를 추가하였으면 주기적으로 컴파일하면서 오류가 있으면 오류를 잡으면서 프로그램을 작성해 나가시기 바랍니다. 오류는 줄여나갈 대상이지 키워나갈 대상이 아니며 한두 개의 오류는 쉽게 잡을 수 있지만 많아지면 오류를 고칠 의지가 꺾일 수도 있습니다.

 

 이제 클래스 다이어그램에 있는 클래스들을 추가해 봅시다. EHLand, UnitFactroy 등 클래스 다이어그램을 보면서 추가를 해 나갑니다. Hall과 같은 파생 클래스를 추가할 때에는 기반 클래스를 명시하여 클래스를 추가하시기 바랍니다. 그리고 개발도구에 의해 자동으로 만들어져 있는 생성자와 소멸자는 헤더 파일과 소스 파일에서 제거하도록 하겠습니다.

 

 클래스들을 추가하였으면 먼저 클래스 다이어그램에 명시한 관계에 따라 필요한 헤더 파일을 추가하도록 합시다. 여기에서는 빌드 타임을 고려하여 효율적으로 헤더를 포함하는 방법에 대해서는 논하지 않겠습니다.

 

 먼저, EHLand.h에 포함할 것들을 추가해 봅시다. EHLand에서는 초기화에서 UnitFactory Hall Village를 생성합니다. 그리고 초기화 시퀀스 다이어그램을 보시면 장소들을 생성하기 전에 ComeBackHelper를 생성하여 생성한 개체를 입력 인자로 넣어줍니다. 그리고 유닛들의 정보를 보거나 유닛을 사용합니다. 이들을 위해 EHLand에는 UnitFactory.h Unit.h, Place.h, Hall.h, Village.h를 포함해야 합니다. 그리고 유닛을 복귀시키는 데 필요한 ComeBackHelper EHLand에 정의하겠습니다. 참고로 ComeBackUnitEvent클래스는 Place.h에 정의하겠습니다. 다음은 이를 반영한 코드입니다.

 

 참고로 class ComeBackHelper; 와 같이 표현하는 것은 프로젝트 내에 ComeBackHelper 클래스가 있다는 것을 컴파일러에게 알려주는 역할을 합니다. A 형식이 B 형식을 알아야 하고 B 형식이 A 형식을 알아야 할 때면 이와 같은 표현을 이용할 수 있습니다.

 

 이와 같은 표현을 사용할 때 주의할 사항은 class ComeBackHelper; 이 구문이 아직 ComeBackHelper의 정의가 완료된 것이 아니므로 필요한 메모리 크기를 모릅니다. 이러한 이유로 ComeBackHelper 형식에 대한 포인터 변수는 선언할 수 있지만 ComeBackHepler 형식의 변수는 선언할 수 없습니다.

 

EHLand.h

#pragma once

#include "UnitFactory.h"

#include "Unit.h"

#include "Place.h"

#include "Village.h"

#include "Hall.h"

 

class ComeBackHelper;

 

class EHLand

{

};

class ComeBackHelper:

    public ComeBackUnitEvent

{

};

 

  

 Place.h에서는 Unit에 대해서만 알고 있으면 됩니다. Unit이 구체적으로 어떠한 형식의 개체인지를 판단하여 실질적으로 제어하는 것은 Hall이나 Village에서 수행할 것이므로 파생된 형식을 Place에서 알 필요는 없습니다. 그리고 Place에서는 Unit들을 EHLand로 복귀시키기 위한 클래스의 추상화된 ComeBackUnitEvent를 구현이 되어야 합니다. 이 부분도 Place에 추가하도록 하겠습니다.

 

Place.h

#pragma once

#include "Unit.h"

class ComeBackUnitEvent

{

};

class Place

{

};

 

 

 Hall에서는 무대에 올라가기 메뉴에서 선택한 유닛이 Artist일 경우에 논평하는 부분이 있기 때문에 Artist가 정의된 헤더 파일을 포함을 시킵니다. 하지만 Artistr라 해서 별도의 멤버 필드에 보관할 필요는 없기 때문에 Artist.h Hall.cpp에 추가하는 것이 더 효과적일 수도 있습니다. 여기에서는 Hall.h에 포함시키기로 하겠습니다.

 

Hall.h

#pragma once

#include "Place.h"

#include "Artist.h"

class Hall :

    public Place

{

};

 

 

 Village에서도 소등하기에서 Worker 유닛은 알람을 설정해야 하고 휴식하기에서는 Magician이 달나라 여행을 가야 하므로 Worker.h Magician.h를 추가해 주어야 합니다. 마찬가지로 관리하는 멤버 필드나 입력 인자나 반환 형식으로 Worker Magician 형식이 사용되는 것이 아니고 구체적인 코드에서만 필요하다면 헤더 파일이 아닌 소스 파일에 추가하는 것이 효과적일 수 있습니다. 여기에서는 헤더 파일에 추가하도록 하겠습니다.

 

Village.h

#pragma once

#include "Place.h"

#include "Magician.h"

#include "Worker.h"

 

class Village :

    public Place

{

};

 

 

 UnitFactory.h 에서는 Magician, Artist, Worker을 생성을 합니다. 그리고 UnitFactory는 소멸 시에 자신이 생성한 모든 Unit 개체들을 소멸시켜야 하므로 이들을 관리하고 있어야 합니다.

 

UnitFactory.h

#pragma once

#include "Unit."

#include "Magician.h"

#include "Artist.h"

#include "Worker.h"

class UnitFactory

{

};

 

 

 그리고 Unit은 추상화된 IPlay IRelax를 구현 약속해야 하므로 이들을 포함하고 있어야 할 것입니다.

 

Unit.h

#pragma once

#include "IPlay.h"

#include "IRelax.h"

class Unit:

    public IPlay, public IRelax

{

};

 

 외에 Magiacian, Artist, Worker클래스에서는 기반 클래스 형식에서 파생되었다는 것만을 표현하면 되기 때문에 Unit.h만 추가하면 됩니다. 클래스를 추가할 때 기반 클래스를 명시하고 생성하였다면 개발 도구에 의해 자동으로 추가되었을 것입니다.

 

Magician.h

#pragma once

#include "Unit.h"

class Magician :

    public Unit

{

};

 

Artist.h

#pragma once

#include "Unit.h"

class Artist :

    public Unit

{

};

 

Worker.h

#pragma once

#include "Unit.h"

class Worker :

    public Unit

{

};

 

10 OOP Part1

10 OOP Part2

10 OOP Part3

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

반응형