[Software Engineering] 구조 모델링 - 클래스 다이어그램

Mineru·2024년 2월 1일

Software Engineering

목록 보기
1/1

A. 아래 내용은 소프트웨어 공학 이론과 실제(한빛아카데미, 홍장의) 교재를 기반으로 정리한 것입니다.

B. 목차 순서가 아닌 필요한 것들을 공부한대로 작성한 것입니다. 목차가 필요할 시 태그 검색 및 검색 후 알맞는 주제로 읽어주시길 바랍니다.

사람들이 실생활에서 사용하는 SW나 솔루션을 제작하는 것이 개발자들의 일이다. 하지만, 일반적인 산업들과 다르게 SW는 그 실체가 정확히 이루어지지 않고 구두로 전달할 시 의미가 틀어저 이를 정확히 설계하는 것이 필요하다. 오늘은 이 설계과정 중 실제 프로그램의 구조를 알 수 있는 '클래스 다이어그램'을 그리는 방법에 대해 이야기해볼까 한다.

클래스 다이어그램은 객체지향 설계에서 객체를 생성하는 클래스와 그 하위의 구성요소(멤버, 메소드)를 정의하는 다이어그램이다. 사용자를 중심으로 작성하는 사용 사례 다이어그램(Use-Case Diagram)과 사용 사례 명세(Use-Case Description)과 다르게 설계할 프로그램의 기능적 요구사항과 그것을 구현하기 위한 프로그램의 관점으로 작성했다고 할 수 있다.

오늘은 이 클래스 다이어그램을 그리는 순서와 주의해야할 사항에 대해 알아보도록 하자.

01. 객체 식별(Textual Analysis)

클래스 다이어그램을 그리기 위해서는 생성되는 객체를 정확히 식별하는 것이 중요하다. 애초에 '클래스(Class)'라는 개념 자체도 객체를 생성하기 위해 추상화된 기본 골자를 이야기하는 것이다. 그렇기에 클래스를 설계하기 위해서는 우선적으로 어떤 종류의 객체들이 생성되는지도 파악해야 한다는 것이다.

사용 사례 명세(Use-Case Description)을 활용해서 클래스명(Class Name), 속성(Attribute), 연산(Operation)의 3요소를 파악하고 클래스 간 상관관계(Relation)을 파악하는 것이 중요하다.
이를 행하기 위해서는 다음과 같은 방법을 사용할 수 있다.

문장 분석

말 그대로 문장을 우선적으로 분석하는 것을 문장 분석이라고 한다. 사용 사례 명세에서 정상 시나리오와 예외 처리 시나리오(Flow & Exception)에 나타난 문장 속에서 구성 요소를 추출하는 것이다.
이 경우는 문장 속 품사를 활용하여 클래스의 구성요소로 매핑하는데 다음과 같이 매핑을 한다.

일반 명사 : 클래스(Class)
타동사 : 연산(Operation)
자동사 : 예외 처리 연산(Exception Operation)
고유 명사 : 인스턴스(Insatnce)
형용사 : 속성(Attribute)
존재, 소유동사 : 관계(Relation)

일반 객체 목록(Common Object List)

일부 특정 도메인에 존재하는 객체들은 용어의존적인 특성을 띄고 있다. 따라서, 도메인별로 나타내는 일반적인 용어들을 식별하여 목록화 한 후에, 이를 구조 모델의 클래스로 사용한다면 객체 식별에 용이해진다.

브레인스토밍(Brain Storming)

문서 분석 외에도 관련자들로 부터 생각을 통해 객체를 추출하는 방법이다. 문서상에 존재하지 않는 클래스를 식별할 수도 있다. 문서상에 존재하지 않는 클래스를 식별한다는 말에서 유추할 수 있듯이, 명세 문서를 사전에 검토하지 않고 진행한다는 것이다. 생각의 한계가 발생할 수 있기 때문이다.

패턴 적용(Pattern Adaption)

패턴은 실제 설계 및 작성 시 클래스와 이들간의 협업 관계를 정의하는 것이다. 추후 다른 SW를 개발할 때 재활용이 가능하고 프로그램을 조금 더 효율적으로 설계할 수 있게 해준다. 이에 대한 것은 추후 GOF 패턴 에 관해 작성 시 기술한다.

02. 클래스 명세

앞선 과정을 통해 클래스 파악이 완료되었다면, 이에 대한 명세가 필요하다. 각 클래스에 대한 설명들을 CRC(Class Responsibility Collaboration)카드를 작성하여 클래스 설계에 대한 정보를 정리한다.

CRC카드는 다음과 같이 작성된다.

기본 정보 명세

CRC 카드 앞면과 뒷면에 클래스 정보를 명세하는데, 앞면에는 대체로 클래스에 대한 기본 정보를 표현한다. 클래스 이름, 식별자, 타입, 설명, 관련된 사용 사례 식별자, 클래스의 책임, 협업 관계를 표현한다.

속성 및 연산 명세

CRC 카드 뒷면에는 클래스의 속성과 연산을 정의한다. 속성에는 멤버 변수(속성 목록)를 나타내고, 관계 항목에는 클래스에 포함되는 연산, 상호작용하는 다른 클래스들과의 관계를 나타낸다.

아래의 그림을 통해 어떤 식으로 작성하는지 확인하면 좋을 듯 싶다.


그림 1. CRC 카드 예제

03. 클래스 다이어그램 작성

식별된 클래스를 CRC 카드로 명세한 후 클래스 다이어그램을 작성한다. 클래스 다이어그램을 그릴 시 내부 구조를 다시 한번 더 확인 후 관계를 부여한다.

클래스 관계 부여 시 다음 3가지 관계성을 생각해서 작성한다.

일반화 관계(Generalization) : 식별된 클래스를 추상화하여 보다 보편적인 클래스로 나타내는 것.
e.g. 사용자와 관리자 클래스를 사람 이라는 보편적인 클래스로 일반화

집합 관계(Aggregation) : 한 클래스를 구성하기 위한 구성요소들이 연관되어있는 관계를 의미함.
e.g. Car라는 집합 클래스는 Door, Wheel, Steering Wheel 등의 클래스로 구성됨

연관 관계(Association) : 두 클래스 간의 일반화 관계와 집합 관계에 속하지 않지만, 각 클래스가 상호 간 영향을 주는 것으로 판단이 될 때.
e.g. 환자와 예약 클래스는 의미상의 연관성은 없지만 업무 수행에서 연관된다.

의존 관계(Dependency) : 어떤 클래스가 다른 클래스를 참조해야하는 경우.
e.g. 사용자 클래스는 스케쥴 클래스를 의존한다.

실체화(Realization) : 특정 인터페이스로서 설계된 클래스를 실제 클래스로 구현할 때 사용.
e.g. CheckLocal 인터페이스를 통해 Local Data Check 클래스를 구현

집합연관(Aggregation) : 연관 관계 중에서 특수한 경우 중 하나. 전체와 부분의 관계를 나타냄

복합 연관(Composition) : Aggregation보다 강한 집합 관계

다음과 같은 관계성은 아래의 그림과 같이 표현한다.

그림 2. 클래스 다이어그램 내에서의 관계 표시

관계성을 모두 따졌다면 다음과 같은 정보를 추가로 표시한다.

속성 가시성(Visibility)

클래스의 속성으로 정의되는 변수가 갖는 접근 법위를 나타낸다.

+표기 : Public
-표기 : Private
#표기 : Protect

관계 기수성(Multiplicity)

연관을 맺은 두 클래스 간에 몇 개의 인스턴스가 발생할 수 있는지 작성하는 것이다.

04. 결론

사실 일반론은 있어도 실제 현장이나 프로젝트 시 작성하는 과정은 생각보다 어렵다고 볼 수도 있다. 굉장히 추상적이기에 실제로 그려보거나 많은 예시들을 보고 고민해 보는 것을 추천한다.

본인 역시 마찬가지로 현재 진행하고 있는 PA-01 프로젝트의 클래스 다이어그램을 작성해야하기에 더더욱이 공부가 필요하여 복습한 것이니 이 글을 보는 다른 사람들도 많이 공부했으면 좋겠다.
필자의 경우는 이번 공부를 통해 수업 때 한번에 못 알아 들을만한 이유를 파악했고, 계속 경험하여 작성하는 것이 배우는 방법이라고 생각했다.

profile
Mineru's Places

0개의 댓글