이번에는 학생 복귀 기능에 관해 시퀀스 다이어그램을 작성하고 난 후에 구체적인 코드를 구현합시다.
학생 복귀 보기에서는 장소에 있는 학생을 선택하여 IComeBack 개체를 이용하여 복귀하게 합니다. 이를 위해 장소에 있는 학생 중에 사용자가 입력한 PN과 일치하는 학생을 찾는 부분이 필요합니다.
![시퀀스 다이어그램](http://ehpub.dothome.co.kr/wp-content/uploads/2022/04/2-71.png)
먼저 IComeBack 인터페이스에 ComeBack 메서드를 약속하세요.
interface IComeBack { virtual void ComeBack(Man *man)=0; };
그리고 IComeBack 인터페이스에서 파생한 EhNara에 이를 재정의해야겠죠. 먼저 클래스에 메서드를 선언하세요.
class EhNara:public IComeBack { ...중략... public: ...중략... virtual void ComeBack(Man *man);//학생 복귀 ...중략... };
EhNara의 ComeBack 메서드를 구현합시다.
void EhNara::ComeBack(Man *man)//학생 복귀 { 학생 컬렉션은 Student * 형식 개체를 보관하므로 dynamic_cast를 이용하여 하향 캐스팅하세요. Student *stu = dynamic_cast<Student *>(man); 만약 하향 캐스팅 결과가 0이면 프로그램에 논리적 버그가 있은 것이므로 예외를 던져줍니다. if(stu == 0) { throw "Student 형식이 아닙니다."; } 학생은 순차보관하세요. base.PushBack(stu);//순차 보관 }
이제 Place의 ComeBackStu 메서드를 구현합시다.
void Place::ComeBackStu()//유닛 복귀 { 이동할 유닛을 선택부터 해야겠죠. Man *man = SelectMan();//이동할 유닛 선택 잘못 선택하였을 때는 이를 출력하고 메서드를 종료합니다. if(man == 0) { cout<<"잘못 선택하였습니다."<<endl; return; } 유닛을 장소에서 제거한 후에 학생을 복귀합니다. EraseMan(man);//유닛 제거 ic.ComeBack(man);//학생 복귀 }
유닛 선택 기능을 구현합시다. 이 부분은 EhNara의 학생 선택 기능과 같습니다.
Man *Place::SelectMan()//유닛 선택 { 먼저 선택할 학생의 주민번호를 입력받으세요. cout<<"선택할 학생의 주민번호:"; int pn=0; cin>>pn; 보관한 학생 중에 입력한 주민번호와 일치하는 학생을 찾아 반환합니다. size_t size = base.GetSize();//보관한 학생 수 구하기 for(size_t i=0;i<size;++i) { if(base[i]->GetPN() == pn)//학생 주민번호와 입력한 주민번호가 같을 때 { return base[i]; } } 만약 일치하는 학생을 발견하지 못하면 0을 반환합니다. return 0; }
유닛을 제거하는 메서드를 구현합시다.
void Place::EraseMan(Man *man)//유닛 제거 { 학생 컬렉션에서 같은 학생을 찾아 컬렉션의 RemoveAt 메서드를 이용하여 개체를 지우세요. size_t size = base.GetSize();//보관한 학생 수 구하기 for(size_t i=0;i<size;++i) { if(base[i]==man)//보관한 학생과 입력 인자로 받은 학생이 같을 때 { base.RemoveAt(i);//해당 인덱스에 보관한 개체 지우기 return; } } }