소프트웨어 개발에서 객체지향 프로그램은 독립 객체들의 묶음이다. 따라 분석과 설계 단계에도 프로그램 모듈 단위인 객체의 정적인 구조와 동적인 변화를 미리 고려해야 한다. 분석 단계에서는 사용자 관점에서 여러 사용 사례를 찾아보고 클래스들의 정적인 관계와 객체들의 인터랙션을 찾아낸다. 설계 단계에선 클래스들의 묶음으로 시스템 구조를 정의하고 클래스 내부를 설계한다. 이러한 분석과 설계과정은 순차적 과정이 아니다. 이는 반복과 점증적 개발 프로세스를 사용하고 있으며 이를 통해 반복적 사이클을 거치면서 점차 확장되고 완성되어 가는 것이다.
객체지향 분석과 설계과정은 누구나 공통으로 사용하는 프로세스는 없다. 물론 여러 가지 제안 프로세스들이 있으나 모두 상이하다. 이에 모델링은 매우 중요하게 대두된다. 모델은 프로젝트에 참여하는 모든 사람이 목표로 하는 소프트웨어를 잘 이해할 수 있게 하며 이를 사용함으로써 시간과 비용을 절약할 수 있다. 객체지향 분석과 설계에서는 보통 3가지 모델을 사용한다. 이는 기능 모델(Use case Diagram), 객체모델(Class Diagram), 동적모델(State Diagram/Sequence Diagram)이 그것이다.
Use Case
객체지향을 통해 시스템 개발 시 가장 먼저 할 일은 요구사항을 추출하는 것으로 여기에 Use Case가 사용된다. Use Case는 시스템이 수행할 것으로 기대되는 기능을 말하는데 이는 사용자 또는 외부 시스템이나 기타 요소들이 시스템과 상호작용하는 다이얼로그를 모델링한 것이다. 모든 Use Case는 외부 엔티티들이 시스템과 어떻게 상호작용하는지 가능한 시나리오를 나타내는 것으로 이를 모으면 전체 시스템의 완전한 모습을 보여주는 것이다. 그래서 Use Case는 사용자나 시스템 설계자, 테스터 및 개발자 간 의사소통에 매우 유용하다.
이러한 Use Case는 문제 정의에서 사용사례로 구성된 시스템 명세로 매핑하는 작업이다. Use Case를 작성하고 관계를 찾는 것은 시스템의 요구사항을 명확하게 정의하고 팀 간 의사소통을 원활하게 하며 개발 과정을 체계화하는 것으로 이를 통해 시스템의 기능을 완전하게 이해하고 효과적으로 구현할 수 있다. 이에 대한 작업 과정은 다음과 같다.
- 액터(Actor) 식별
- 액터는 시스템과 상호작용하는 외부 역할이나 개체로서 이해관계자, 사용자, 시스템 등이 액터가 될 수 있음
- 액터를 식별하는 것은 해당 시스템이 상호작용할 주체와 대상을 이해하는 것
- 시나리오(Scenario) 식별
- 시나리오는 특정 액터와 시스템 간의 상호작용 과정을 설명하며 시스템의 특정 기능 또는 작업에 대한 흐름 표현
- 액터마다 여러 시나리오가 있을 수 있음
- Use Case 작성
- Use Case는 특정한 기능 또는 작업에 대한 상세한 설명을 담은 문서로 각 Use Case에는 제목, 목적, 참여자(액터), 사전 조건, 후속 조건, 흐름(시나리오), 대안 흐름 등의 정보 포함
- Use Case를 작성할 때는 해당 기능을 어떻게 사용자가 사용할지를 중심으로 작성
- Use Case 간 관계 찾기
- Use Case 간의 관계를 찾는 것은 시스템의 기능적인 흐름을 이해하고 조직화 도움
- 주요한 두 가지 관계: 일반화 관계(Generalization)와 포함 관계(Inclusion)
- 일반화 관계: 보다 일반적인 Use Case와 그에 따르는 구체적인 Use Case 간의 상속 관계
- 포함 관계: 한 Use Case가 다른 Use Case의 일부 기능을 포함하는 관계
객체 모델링/동적 모델링
Use case를 작성하고 도메인 분석이 어느 정도 마무리되고 나면 객체를 찾고 관계를 정의하는 작업을 시작하게 된다. 이를 객체 모델링이라 부르며, 클래스를 발견하고 난 후 클래스들의 상호작용이나 클래스의 상태 변화 등 시스템 내부의 동작을 구축하는 것을 동적 모델링이라 부르며 UML에서는 Sequence diagram, State diagram, Activity diagram으로 작업한다. 이들은 시스템의 구조와 행동을 모두 고려하여 전체적인 시스템 설계를 돕는 역할을 한다.
- 객체 모델링 (Object modeling)
- 객체 모델링은 시스템의 정적인 측면, 즉 시스템 내 객체들의 구조와 관계에 중점
- 주로 클래스 다이어그램(Class Diagram)과 객체 다이어그램(Object Diagram) 사용
- 클래스 다이어그램은 시스템 내 클래스(객체의 템플릿)들과 그들 간의 관계를 보여주며 클래스의 속성과 메소드 포함
- 객체 다이어그램은 특정 시점에서 객체들의 인스턴스와 그들 간의 관계 표현
- 작업절차
- 엔티티 클래스 찾기: 시스템의 주요 데이터를 나타내는 클래스로 데이터베이스의 테이블과 유사하며 시스템 내의 중요한 개념이나 사물을 표현
- 경계 클래스 찾기: 시스템과 외부 환경 간의 상호작용을 처리하는 클래스로 사용자 인터페이스나 외부 시스템과의 통신 담당
- 제어 클래스 찾기: 시스템의 비즈니스 로직을 처리하고 조정하는 클래스로 엔티티 클래스와 경계 클래스 간의 상호작용 관리
- 연관관계 찾기: 클래스 간의 상호작용과 관계를 나타내며 엔티티 클래스 사이에 형성되고 방향, 다중성, 역할 등 포함
- 속성찾기: 클래스나 객체가 가지는 특징이나 데이터를 나타내며 엔티티 클래스의 상태를 설명하는 정보로 사용
- 동적 모델링 (Dynamic modeling)
- 동적 모델링은 시스템의 행위나 상호작용을 중심으로 설계
- 주로 시퀀스 다이어그램(Sequence Diagram)과 상태 다이어그램(State Diagram) 사용
- 시퀀스 다이어그램은 객체 간의 상호작용 순서를 보여주며 메시지의 흐름을 시각적으로 표현
- 상태 다이어그램은 객체의 생명주기와 상태 변화를 표현하여 객체의 동적인 행위를 이해하게 지원
- 작업절차
- Sequence diagram
- 객체 간의 상호작용을 시간 순서에 따라 시각적으로 표현
- 객체 간에 주고받는 메시지와 메시지의 순서를 보여주어 시스템 내부의 상호작용을 이해
- 시스템의 시간적 흐름을 잘 보여주기 때문에 사용자 스토리나 시나리오를 분석하거나 설계 시 유용
- State diagram
- 객체의 생명주기와 상태 변화를 표현
- 객체가 어떤 상태에서 다른 상태로 전이되는지와 전이가 어떤 조건에서 일어나는지 표현
- 객체의 행위와 상태 변화를 시각적으로 이해하는 데 도움을 주고 특히 복잡한 객체의 동작을 추적하고 이해하는 데 유용
- Activity diagram
- 시스템 내에서 흐름 제어, 동작 및 상호작용을 시각적으로 표현
- 프로세스나 작업의 흐름을 단계별로 표현하여 시스템의 동작을 더욱 자세히 설명
- 주로 비즈니스 프로세스, 사용자 시나리오, 시스템 동작 등을 나타내는 데 사용
- Sequence diagram