7.4 프로젝트 구현
초점이 기숙사 (잠자기, 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); } } } |
이상으로 첫 번째 프로그램 실습인 캠퍼스 생활을 만드는 일련의 과정을 소개하였습니다. 이처럼 프로그래밍 언어의 문법이나 프로그래밍 기술을 학습하는 과정에서는 더 정확하게 자신의 것으로 만들기 위해 프로그램을 만들어 보시기 바랍니다. 그리고 단순히 프로그램이 동작하게 하려고만 하지 마시고 좋은 공정과 견고한 설계를 하는 것을 생략하지 마시기 바랍니다. 이 책에서 보여준 캠퍼스 생활도 취약한 구조가 존재할 것입니다. 여러분께서 보다 견고한 구조로 설계를 하시고 구현해 보시기 바랍니다.
너와 나의 연결고리 "공감"
'언어 자료구조 알고리즘 > Escort C#' 카테고리의 다른 글
[C#] 8.2 컬렉션 - IList 인터페이스 (0) | 2016.05.03 |
---|---|
[C#] 8.2 컬렉션 - ICollection 인터페이스 (0) | 2016.05.03 |
[C#] 8.2 컬렉션 - IEnumerable, IEnumerator 인터페이스 (0) | 2016.05.03 |
[C#] 8.2 컬렉션 - 개요 (0) | 2016.05.03 |
[C#] 8. 인터페이스와 컬렉션 - 인터페이스 (0) | 2016.05.03 |
[C#] 7.4 프로젝트 구현 - 초점이 도서관 (책 읽기, 세미나) (0) | 2016.05.03 |
[C#] 7.4 프로젝트 구현 - 초점이 강의실 (판서 강의, 발표 수업) (0) | 2016.05.03 |
[C#] 7.4 프로젝트 구현 - 초점 이동 (0) | 2016.05.03 |
[C#] 프로젝트 구현 - 학생 이동 (2) | 2016.05.03 |
[C#] 7.4 프로젝트 구현 - Run(메뉴 및 사용자와 상호작용) (0) | 2016.05.03 |