[C#] 7.2.2 시퀀스 다이어그램 작성

클래스 다이어그램을 작성하였으면 시나리오를 기반으로 분석된 기능별로 시퀀스 다이어그램을 작성합시다. 먼저, 초기화 과정에 대해 살펴봅시다. 초기화에서는 캠퍼스 생성과 장소들을 생성하는 것과 학생 생성이 진행하기로 했어요. 캠퍼스 생성이나 장소들을 생성하는 것은 사용자와의 상호 작용 없이 진행되기 때문에 단순히 생성자만 호출합니다. 그리고 학생 생성은 사용자에 의해 생성할 학생 수를 입력, 생성할 학생 유형을 선택, 학생의 이름을 결정하기 위해 상호 작용이 필요합니다. 또한, 생성된 학생은 Campus에 보내야겠지요.

[그림32 - A] 초기화 시퀀스 다이어그램(캠퍼스와 장소 생성)
[그림32 – A] 초기화 (캠퍼스와 장소 생성)
[그림32 - B] 초기화(학생 생성)
[그림32 – B] 초기화(학생 생성)
 

사용자 명령에 따른 동작은 각 메뉴를 선택하면 각각의 기능에 대한 시퀀스를 약속합시다.

 

먼저, 학생 이동에 대해 살펴볼게요. 시나리오를 보시면 학생 이동은 캠퍼스에 있는 학생 중에 사용자가 선택된 학생을 사용자가 선택한 장소로 이동을 하게 되어 있습니다. 먼저, 캠퍼스에 있는 학생을 선택하기 위해서는 사용자에게 캠퍼스에 있는 학생들의 기본 정보를 보여주고 선택하게 하는 것이 바람직할 것입니다. 그리고 어떠한 정보를 기반으로 학생을 선택할 것인가에 대한 부분에 대한 구체적인 사항은 시나리오에 나와 있지 않은데 여기에서는 학생 번호로 선택하는 것으로 하겠습니다.

캠퍼스에 있는 학생을 선택하여 꺼내오는 작업은 사용자와 상호 작용이 필요한데 이 프로그램에서 사용자와 상호 작용에 대한 부분은 모두 컴퍼스 생활(CampusLife) 개체에서 담당하는 것으로 하겠습니다. 사용자와 상호 작용을 하는 부분을 담당하는 개체를 두는 이유는 앞으로 윈도우즈 응용으로 변환을 하는 등의 작업이 필요할 때 유지 보수를 쉽게 하기 위함입니다.

[그림 33] 학생 이동 시퀀스 다이어그램
[그림 33] 학생 이동 시퀀스 다이어그램

각 장소로 초점을 이동할 때 공통적인 시퀀스를 생각해 봅시다. 장소로 초점이 이동되기 위해서는 사용자가 특정 장소를 선택할 수 있어야 합니다. 그리고 해당 장소로 초점이 이동되면 각 장소에 해당하는 메뉴 선택에 따른 기능 동작하는 작업이 반복하게 해야겠죠. 또한, 해당 장소에 초점이 종료될 때 해당 장소에 있는 학생 중에 캠퍼스로 복귀하기를 원하는 학생을 선택하여 이동시키는 작업을 수행해야 할 것입니다.

학생들을 캠퍼스로 복귀하는 과정도 사용자와 상호작용이 필요한 부분이므로 컴퍼스 생활(CampusLife) 개체를 통해 사용자에게 필요한 정보를 보여주고 사용자의 요청에 대한 작업을 수행하게 합시다.

[그림 34] 초점 이동 시퀀스 다이어그램
[그림 34] 초점 이동 시퀀스 다이어그램

각 장소에 초점이 이동되어 해당 장소의 메뉴 선택에 따라 수행하는 기능의 시퀀스는 단순하겠죠. 각각에 대해 시퀀스를 생각해 봅시다.

판서 강의는 단순히 모든 학생에게 강의를 받게 하므로 매우 단순하겠네요. 사용자가 판서 강의를 선택했다는 것을 컴패스 생활(CompusLife)개체가 강의실(LectureRoom) 개체에 전달하면 강의실 개체는 강의실에 있는 학생들에게 차례대로 강의를 듣게 하면 될 것입니다. 단, 해당 학생이 도전적인 학생이라면 질문을 하도록 해야겠네요.

[그림 35] 판서 강의
[그림 35] 판서 강의

발표 수업을 선택하면 캠퍼스 생활 개체는 강의실 개체에 모든 학생 정보를 얻어와 화면에 출력하여 사용자가 학생을 선택할 수 있게 해야 합니다. 그리고 캠퍼스 생활 개체는 강의실 개체에 사용자가 발표 수업을 선택하였다는 정보와 선택된 학생을 입력 인자로 전달하여 강의실 개체가 발표 수업을 수행할 수 있게 해야 할 것입니다.

강의실 개체는 선택한 학생이 발표를 수행하게 하고 나머지 학생들에게는 자유 토론을 수행하게 해야 할 것입니다. 그리고 자유 토론을 수행하는 학생이 수동적인 학생일 경우 꾸벅꾸벅 졸면서 자유 토론을 수행하는 부분은 재정의로 구현하기로 하였으므로 시퀀스 다이어그램에는 명시하지 않겠습니다. (여기에서 시퀀스 다이어그램은 서로 다른 개체 사이에 주고받는 메시지에 대해서만 명시하기로 하였기 때문에 생략하는 것입니다. 만약, 구현 단계의 시퀀스를 정의하는 것이라면 명시했을 것입니다.)

[그림 36] 발표 수업
[그림 36] 발표 수업

세미나 진행은 단순히 캠퍼스 생활 개체가 도서관 개체에 세미나 진행을 선택한 사실을 전달하면 도서관 개체에서 학생들에게 세미나를 듣게 하면 되겠죠.

[그림 54] 세미나
[그림 54] 세미나

책 읽기는 사용자가 학생을 선택할 수 있게 도서관에 있는 모든 학생 정보를 얻어와 사용자에게 보여주어 선택할 수 있게 하는 과정이 필요합니다. 그리고, 사용자가 학생을 선택하면 캠퍼스 생활 개체에서는 도서관에게 세미나를 선택하였다는 정보와 선택한 학생 정보를 입력 인자로 전달하여 도서관 개체가 해당 학생에게 책을 읽을 수 있게 해야겠지요.

[그림 37] 책 읽기
[그림 37] 책 읽기

TV 시청은 세미나 진행처럼 단순히 캠퍼스 생활 개체가 기숙사 개체에 TV 시청을 선택한 사실을 전달하여 기숙사 개체가 학생들에게 TV 시청하게 하세요.

[그림 38] TV 시청
[그림 38] TV 시청

잠자기에서도 TV 시청처럼 캠퍼스 생활 개체가 기숙사 개체에 잠자기를 선택한 사실을 전달하면 기숙사 개체가 학생들에게 잠을 자게 하면 되겠네요. 대신 해당 학생이 수동적인 학생인지 확인하여 맞았다면 잠꼬대를 하게 해야 합니다.

[그림 39] 잠자기
[그림 39] 잠자기

전체 보기를 선택은 캠퍼스와 각 장소에게 학생들 정보들을 얻어와서 이를 화면에 보여주세요.

[그림 40] 전체 보기
[그림 40] 전체 보기

이상으로 전체 기능의 시퀀스 다이어그램을 작성해 보았습니다. 그런데 여기에서 한 시퀀스 다이어그램들을 살펴보다 보면 같은 서브 시퀀스가 자주 발생하는 것을 볼 수 있습니다. 이러한 것들은 별도의 시퀀스 다이어그램으로 작성하여 이를 포함하는 시퀀스 다이어그램에서는 별도로 작성한 시퀀스를 수행한다는 것을 명시함으로써 중복의 해악을 줄일 수 있을 것입니다. 어느 정도의 수준에서 설계하는 것이 좋은 것인지에 대한 부분은 프로그램의 규모와 참여 인원, 기간 등에 따라 다릅니다. 여러분이 학습하는 단계라면 설계 비용이 많이 들더라도 될 수 있으면 완성도 있게 설계를 하실 것을 권장하고 싶습니다.

또한, 이 책에서는 사용자와 상호 작용을 하는 부분을 CampusLife에게 일임하고 있고 다른 곳에서는 이를 수행하고 있지 않다는 점 때문에 개발 비용이 많이 든다고 생각하실 수도 있습니다. 여기에서는 작성하는 프로그램이 콘솔 응용이지만 윈도우즈 응용으로 바뀔 수도 있다는 점을 고려하여 작성하였기 때문에 사용자와 상호 작용하는 부분만 수정하더라도 나머지 부분을 사용할 수 있게 하기 위함입니다.

또한, 어떤 이는 사용자와 상호 작용을 하는 부분도 좀 더 역할에 따라 나누어 개체화가 필요하고 사용자와 상호 작용을 하지 않는 부분들을 관리하는 역할에 해당하는 개체도 정의하면 좀 더 유연성 있다고 생각하실 수 있습니다. 이처럼 관점과 목적 등에 따라 설계는 다양하게 나올 수 있습니다. 여러분께서는 언어의 문법 사항을 익히고 사용할 수 있다는 것에 만족하지 마시고 설계나 개발 방법론 등에 관련된 학습도 하시길 바랍니다.