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

[C#] 7.4 프로젝트 구현 - 초점이 기숙사 (잠자기, TV 시청)

언제나휴일 2016. 5. 3. 14:24
반응형

7.4 프로젝트 구현

 

초점이 기숙사 (잠자기, TV 시청)


EX_CampusLife.zip



TV 시청 시퀀스 다이어그램

[그림] TV 시청 시퀀스 다이어그램


잠자기 시퀀스 다이어그램

[그림] 잠자기 시퀀스 다이어그램


 이번에는 초점이 기숙사에 왔을 때 수행하는 잠자기와 TV 시청에 대한 부분을 구현하기로 합시다. 앞에서 초점이 강의실과 도서관에 왔을 때 수행하는 부분과 구현하는 방법이 크게 다르지 않겠지요.

 

class CampusLife

{

    ... 중략 ...

 

    private void FocusAtDormitory(Dormitory dormitory)

    {

        ConsoleKey key;

        while ((key = SelectDormMenu()) != GameRule.ExitKey)

        {

            switch (key)

            {

                case GameRule.DO_Sleep: StartSleep(dormitory); break;

                case GameRule.DO_TV: StartTV(dormitory); break;

                default: Console.WriteLine("잘못된 메뉴를 선택하였습니다."); break;

            }

 

            Console.WriteLine("아무키나 누르세요.");

            Console.ReadKey();

        }

    }

 

    private void StartTV(Dormitory dormitory)

    {

        dormitory.DoIt(GameRule.CMD_DO_Sleep);

    }

 

    private void StartSleep(Dormitory dormitory)

    {

        dormitory.DoIt(GameRule.CMD_DO_TV);

    }

 

 

    private ConsoleKey SelectDormMenu()

    {

        Console.Clear();

        Console.WriteLine("기숙사 메뉴");

        Console.WriteLine("{0} 잠자기", GameRule.DO_Sleep);

        Console.WriteLine("{0} TV 시청", GameRule.DO_TV);

        Console.WriteLine("{0} 캠퍼스 생활로 돌아가기", GameRule.ExitKey);

 

        return Console.ReadKey().Key;

    }

}

 

 이제 시퀀스 다이어그램을 보면서 잠자기와 TV 시청을 구현해 보기로 합시다. Library클래스의 입력 인자가 한 개 오는 DoIt 메서드도 LectureRoom에서 구현했던 것과 큰 차이가 없겠죠.

 

class Dormitory:Place

{

    ... 중략 ...

 

    internal override void DoIt(int cmd)

    {

        switch (cmd)

        {

            case GameRule.CMD_DO_Sleep: TurnOff(); break;

            case GameRule.CMD_DO_TV: StartTV(); break;

            default: return;

        }

    }

 

    private void StartTV()

    {

        int cnt = GetStuCount();

        Student student = null;

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

        {

            student = GetStudent(i);

            student.WatchingTV();

        }

    }

    private void TurnOff()

    {

        int cnt = GetStuCount();

        Student student = null;

        PStudent pstudent = null;

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

        {

            student = GetStudent(i);

            student.Sleep();

            pstudent = student as PStudent;

            if (pstudent != null)

            {

                pstudent.TalkingInSleep();

            }

        }

    }

}

  

 이제 시나리오를 보면서 Student 클래스에 Sleep 메서드와 WatchingTV 메서드를 구현합시다. 단순히 시나리오대로 능력치를 변경하면 될 것입니다. WatchingTV의 경우 보수적인 학생은 구체적인 행위가 다르므로 가상 메서드로 정의해야겠지요.

 

abstract class Student

{

    ... 중략 ...

    internal void Sleep()

    {

        Console.WriteLine("{0} 아이큐:{1} 체력:{2} 대화능력:{3}", ToString(), Iq, Hp, Cp);

        Console.WriteLine("잠을 자다.");

        Hp += 2;

        Console.WriteLine("{0} 아이큐:{1} 체력:{2} 대화능력:{3}", ToString(), Iq, Hp, Cp);

    }

    internal virtual void WatchingTV()

    {

        Console.WriteLine("{0} 아이큐:{1} 체력:{2} 대화능력:{3}", ToString(), Iq, Hp, Cp);

        Console.WriteLine("TV를 시청하다.");

        Hp -= 2;

        Console.WriteLine("{0} 아이큐:{1} 체력:{2} 대화능력:{3}", ToString(), Iq, Hp, Cp);

    }

}

 

 보수적인 학생의 경우 WatchingTV 메서드를 재정의합니다.

 

class MStudent:Student

{

    ... 중략 ...

    internal override void WatchingTV()

    {

        base.WatchingTV();

        Cp -= 1;

        Console.WriteLine("보수적인 학생, 추가로 대화능력에 변화: {0}", Cp);

    }

}

 그리고 수동적인 학생이 잠을 잘 때 추가로 잠꼬대하는 TalkingInSleep 메서드를 구현합시다. 마찬가지로 시나리오를 보면서 능력에 변화를 주면 되겠죠.

 

class PStudent:Student

{

    ... 중략 ...

    internal void TalkingInSleep()

    {

        Console.WriteLine("{0} 아이큐:{1} 체력:{2} 대화능력:{3}", ToString(), Iq, Hp, Cp);

        Console.WriteLine("잠꼬대를 하다.");

        Hp -= 1;

        Iq += 1;

        Console.WriteLine("{0} 아이큐:{1} 체력:{2} 대화능력:{3}", ToString(), Iq, Hp, Cp);

    }

}

 

 마지막으로 전체 보기 기능을 구현해 봅시다. 이 부분은 이미 다른 기능들을 구현하면서 작성된 메서드를 이용하기만 하면 되겠네요.

 

class CampusLife

{

    ... 중략 ...

    private void View()

    {

        Console.WriteLine("캠퍼스");

        ViewStuInfoInCampus();

        foreach (Place place in places)

        {

            Console.WriteLine(place.ToString());

            ViewStuInfoInPlace(place);

        }

    }

}

 

 이상으로 첫 번째 프로그램 실습인 캠퍼스 생활을 만드는 일련의 과정을 소개하였습니다. 이처럼 프로그래밍 언어의 문법이나 프로그래밍 기술을 학습하는 과정에서는 더 정확하게 자신의 것으로 만들기 위해 프로그램을 만들어 보시기 바랍니다. 그리고 단순히 프로그램이 동작하게 하려고만 하지 마시고 좋은 공정과 견고한 설계를 하는 것을 생략하지 마시기 바랍니다. 이 책에서 보여준 캠퍼스 생활도 취약한 구조가 존재할 것입니다. 여러분께서 보다 견고한 구조로 설계를 하시고 구현해 보시기 바랍니다.


너와 나의 연결고리 "공감"

반응형