[디딤돌 C++] 85. 최종 실습 – 노래방 가기

이번에는 노래방 가기 기능에 관해 시퀀스 다이어그램을 작성하고 난 후에 구체적인 코드를 구현합시다.

노래방 가기에서는 학생을 선택하여 학생의 Sing을 수행합니다. 각 장소에서는 해당 장소에서 명령할 수 있는 기능만 보이게 한정하였기 때문에 IPlay 인터페이스 형식으로 학생 개체에 접근해야 합니다. 그리고 선택한 학생이 운동 학생이면 Dance 기능을 수행합니다. 물론 학생을 선택하기 위해서는 사용자에게 주민번호를 입력받아 컬렉션 내에 유닛과 비교하는 부분이 있어야 합니다. 이 부분은 이미 기반 클래스 Place에 구현하였기 때문에 이를 활용합니다.

시퀀스 다이어그램

IPlay 인터페이스에 Sing 메서드를 순수 가상 메서드로 약속하세요.

interface IPlay
{
    virtual void Drink();
    virtual void Sing();
};

다운타운의 GoToSing 기능을 구현합시다.

void Downtown::GoToSing()//노래방으로 가기
{
    cout<<"노래방으로 가기"<<endl;
먼저 학생을 선택합니다. 이 부분은 기반 클래스 Place에 정의한 멤버를 이용합니다.
    Man *man = SelectMan();
    if(man==0)
    {
        cout<<"잘못 선택하였습니다."<<endl;
         return;
    }
다운타운에서는 IPlay 에 약속한 기능만 수행하므로 하향 캐스팅하세요.
    IPlay *iplay = dynamic_cast<IPlay *>(man);
    if(iplay)
    {
IPlay 인터페이스의 Sing 메서드를 호출하세요.
        iplay->Sing();
운동 학생일 때는 춤추기 위해 다시 하향 캐스팅합니다.
        PStudent *pstu = dynamic_cast<PStudent *>(iplay);
        if(pstu)
        {
            pstu->Dance();
        }
    }
    else
    {
만약 하향 캐스팅을 실패하였으면 버그이므로 예외를 던지세요.
        throw "IPlay 형식으로 하향 캐스팅을 하지 못하였습니다.";
    }
}

학생 클래스에 Sing을 가상 메서드로 변경하고 누가 노래하는지 출력합시다.

class Student:public Man, public IStudy, public IRelax, public IPlay
{
    ...중략...
public:
    ...중략...
    virtual void Sing();
    ...중략...
};

Student 클래스의 Sing 메서드에서는 누가 수행하는 것인지 출력합시다.

void Student::Sing()
{
    cout<<GetName()<<" 노래하다."<<endl;
}

그리고 학사 학생, 마법 학생, 운동 학생의 Relax에서는 Student 클래스의 Sing 메서드를 호출하는 부분을 추가하세요.

void SStudent::Sing()
{
    Student::Sing();
    ...중략...
}
void MStudent::Sing()
{
    Student::Sing();
    ...중략...
}
void PStudent::Sing()
{
    Student::Sing();
    ...중략...
}

운동 학생의 Dance 기능에도 누가 춤추는지 출력하는 구문을 추가합시다.

void PStudent::Dance()
{
    cout<<GetName()<<" 춤을 추다."<<endl;
    SetHP(GetHP()-5); //체력 5 소모
    SetIQ(GetIQ()+3);//지력: 3증가
    air++;//air 1증가
}

이제 컴파일 및 빌드하신 후에 테스트를 해 보세요.

이 책의 최종 실습까지 진행하였습니다. 여러분들께서 보다 설계 능력을 키우시고 싶다면 “Escort GoF의 디자인 패턴”과 같은 설계에 관해 다루는 레퍼런스를 참고하세요. 그리고 다른 형태의 시나리오를 기획하고 프로그래밍 연습을 하실 것을 권합니다.