|
Class diagram을 처음부터 상세하게 정의할 수는 없습니다. 그래서 상세한 class
diagram을 얻기 위해 단계적으로 상세화시켜 나가는 방식을 사용합니다.
Class Diagram은 다음과 같이 3가지 관점으로 반복적이면서 점증적인 방식으로
작성해 나갑니다. |
Conceptual level
- 개발범위에 속해있는 문제영역에 대해 단순한 관계를 도출하는데 중점
- 업무 관점의 class 들만 도출하고, 구현에 관련된 시각은 최대한으로 배제
Specification level
- 구현관점을 살려 모델링을 수행
- 어떻게 코딩할 건지에 대한 관점을 배제
- 클래스의 속성과 오퍼레이션을 될 수 있는 한 상세히 정의하고, 구체적인 플랫폼(개발언어의 특성 등)특성을 반영하지 않음.
Implementation level
- 언어와 개발플랫폼이 가진 특성 및 제한 사항을 반영
- 정의된 class를 보고 정해진 개발언어로 개발자가 코딩을 하기에 충분한 정보를 모두 표현
|
클래스 다이어그램의 구성요소는 다음과 같습니다. |
 |
| |
|
 |
일반적인 클래스 표기법 |
 |
|
클래스는 일반적인 표기와 icon 표기 두 가지의 표기가 가능합니다. 일반적인
표기는 단순형 표기와 정규형 표기등 두 가지가 있습니다. |
 |
|
|
 |
|
단순형 표기 |
정규형 표기 |
 |
직사각형에 클래스 명을 표기 |
 |
 |
Conceptual Level(개념 단계)의 클래스 |
|
다이어그램을 작성할 경우나, 클래스가
많아 그림이 복잡할 경우의 생략형 표현 | |
| |
 |
|
| | |
|
클래스는 크게 대별하면 Boundary, Entity, Control 다음 세 가지 종류로 구분할 수
있습니다. |
 |
|
 | |
|
 |
 |
|
 |
정의 및 특징 |
 |
|
 |
Aggregation 관계는 Association관계의 일종입니다. |
 |
 |
Aggregation은 두 클래스간에 "전체-부분(whole-part)"의 관계가 있을 경우 |
|
정의됩니다. |
 |
 |
Aggregation 관계는 클래스 각각이 독립적인 생명주기를 가집니다. |
|
즉, 전체에 해당되는 클래스가 소멸되더라도 부분에 해당되는 클래스는 소멸하지
않고 계속 존재할 수 있습니다. | |
 |
 |
표기법 |
 |
|
 |
속이 빈 마름모가 붙은 실선 |
|
 |
- 마름모가 붙은 쪽이 "전체" 클래스,
반대쪽은 "부분" 클래스
- 왼쪽의 예는 자동차는 1개의
엔진과 1개의 변속기와 4개의
바퀴로 구성된다는 의미 자동차가
소멸되더라도 부품으로서의 엔진,
변속기,바퀴는 소멸되지 않음 | | | | | |
|
 |
정의 및 특징 |
 |
|
|
 |
 |
표기법 |
 |
|
 |
삼각형 화살표가 붙은 실선 |
 |
|
 |
|
- 결재 클래스는 보다 일반적인 클래스 (Generalized Class)이고, 금결재,
카드결재, e-cash결재는 보다 특수화(Specialized Class)된 관계임 |
|
- 결재 클래스의 속성과 오퍼레이션은 공통적이고 일반적인 것으로 정의되고,
하위의 3개의 클래스는 자신만의 특수한 속성과 오퍼레이션을 정의함 |
|
- 일반화된 속성, 오퍼레이션과 동일한 것을 하위의 클래스가 정의해야할
필요가 있더라도 이를 정의하지 않음. (상속되어 따로 정의하지 않더라도
일반 클래스의 것을 그대로 사용할 수 있기 때문) | | | | | |
|
|
 |
 |
 |
Dependency 관계로 정의되는 사례 | |
클래스 사이에 Dependency 관계가 정의되는 경우는 다음과 같습니다.
(A 클래스와 B 클래스 사이에 A-->B의 Dependency 관계를 가정합니다.)
| |
클래스 식별방법
|
클래스를 식별하는 것은 객체지향 패러다임에 익숙하지 않은 초보자에게 쉬운 일은
아닙니다. 클래스를 식별하는 쉽고 확실한 방법은 경험이 가져다 주는 직관입니다.
그러나 초보자에게는 막막하기만 합니다. |
 |
가장 효과적인 방법은 후보 클래스에서 부적합한 것을 탈락시키는 방법입니다.
초보자가 사용할 수 있는 적절한 방법은 클래스가 될 수 있는 후보 클래스를 가능한 한
많이 나열한 후 부적합한 것들을 제거해 나가는 방법입니다. 후보 클래스를 나열하기
위해서는 문제영역을 잘 분석하여 이해하는 것이 선행되어야 합니다. |
 |
클래스를 식별하기 위해서 다음 순서로 진행합니다. |
 |
※ 아래의 번호를 순서대로 클릭하세요 |
 |
| |
|
 |
 |
|
다음은 SW 시스템에 대한 문제영역 기술서입니다. 아래의 기술서를 읽어 보고 클래스를
식별해 봅시다. |
 |
"An automatic teller machine accepts a cash card, interacts with the user,
communicates with the central system to carry out the transaction,
dispenses cash, and prints receipts. The system requires appropriate
record keeping and security provisions. The system must handle concurrent
accesses to the same account correctly. The banks will provide their own
software for their own computers; you are to design the software for the
ATMs and the network. The cost of the shared system will be apportioned to
the banks according to the number of customers with cash cards." | |
 |
 |
후보 클래스 나열 (명사) |
 |
|
위 문제 기술서를 토대로 찾아낸 후보 클래스는 다음과 같습니다. |
 |
|
 |
Software , Banking Network , cashier |
 |
 |
ATM , Bank , Bank Computer |
 |
 |
Account, Transaction, Account Data |
 |
 |
Central Computer, User, Cash, Receipt |
 |
 |
System , Record Keeping , Security Provision |
 |
 |
Access , Cost , Customer | | |
 |
 |
부적합한 것들 탈락시킴 |
 |
|
 |
문제영역과 상관없는 것 |
|
Banking Network , Recording Keeping, System, Security Provision |
 |
 |
속성에 해당하는 것 : Receipt , Cash , Account Data |
 |
 |
모호한 : Cost |
 |
 |
중복된 것 : User | | |
 |
 |
클래스로 채택된 것 |
 |
|
| | |
관계수와 특별한 클래스 간 관계
|
 |
정의 |
 |
|
 |
클래스와 클래스가 인스턴스화 되어 연결 관계를 맺을 때, 관계에 참여하는 |
|
객체의 개수를 정의한 것입니다. |
 |
 |
특정 클래스의 인스턴스에 대해 Association 관계에 있는 다른 클래스의 |
|
인스턴스가 몇 개 관련되어 있는가를 의미합니다. | |
 |
 |
관계수의 유형 |
 |
|
| | |
사례연구
|
다음은 대학에서 교과목과 교수, 학생을 클래스 다이어그램으로 모델링한 사례입니다.
다이어그램을 잘 살펴보고 의미하는 바를 해석해 봅시다. |
 |
|
|
대학에서 교과목과 교수, 학생을 클래스 다이어그램으로 모델링한 사례입니다.
모델링 초기단계라서 속성과 오퍼레이션은 정의되어 있지 않습니다.
이 모델은 다음과 같은 정보를 줍니다.
 |
교수는 교과목을 3개까지 강의할 수 있습니다. |
|
 |
학생은 과목은 수강하지 않거나 네 과목까지 수강할 수 있습니다. |
|
 |
한 교과목당 적어도 3명이상 많아도 10명까지 수강할 수 있습니다. | | |
|
|
다음은 정보처리 시스템에서 흔히 볼 수 있는 전형적인 클래스입니다.
다이어그램을 잘 살펴보고 의미하는 바를 해석해 봅시다. |
 |
| |
제일 윗쪽의 클래스들은 boundary class입니다. UI를 제어하는 역할을 가집니다.
Boundary Class들은 UI 이벤트가 발생할 때 MemberManagement 클래스를
생성시키고, 이 클래스의 오퍼레이션에 적절한 처리를 의뢰하게 됩니다.
명령을 접수한 MemberManagement 클래스는 실제로 데이터를 관리하는
<<entity>>형 클래스인 Member 클래스에게 실제 데이터를 저장하고 조회하도록
의뢰합니다. Member 클래스는 Data Base에 접근하여 접수한 처리를
수행합니다.
이 예는 정보처리 시스템에서 흔히 볼 수 있는 전형적인 클래스의 구조이자 형태입니다.
|
실제 현실에서 경험할 수 있는 사례를 가지고 모델링을 수행한 결과를 살펴보도록
하겠습니다. 아래에 기술된 문제영역은 모델링의 대상이 되는 주제와 이것과 관련된
주변정보를 제공합니다. 이 문제영역을 분석하여 클래스 다이어그램을 작성해 보세요.
그런 다음 다이어그램 보기 버튼을 클릭하여 클래스 다이어그램과 비교해 보시기
바랍니다. |
 |
 |
A병원은 이번 기회에 SW 시스템을 구축하여 업무의 일부를 자동화 하기를
원합니다. A병원에는 기존 시스템으로 병원의 수입과 지출을 관리하는
"회계 시스템"이 운영되고 있습니다. 이 시스템과 연계하면서 병원정보, 환자의
병력 및 진료정보, 의료진 정보의 각종 정보 관리와 진료 예약 처리 및 수납지원을
수행하는 신규 시스템을 구축하기를 원하고 있습니다.
병원의 각 관계자는 시스템을 통해 아래와 같은 기능을 수행하기를 원합니다. |
 |
 |
진료비는 진료정보를 입력하면 자동 산정됩니다. |
 |
 |
환자는 진료 예약을 하고, 환자의 과거병력과 진료정보는 관리됩니다. |
 |
 |
일반사용자는 병원 정보와 의료진 정보를 조회하고 상담 및 문의를 할 수 |
|
있습니다. |
 |
 |
의료진은 자신의 진료스케쥴을 자동 생성하고, 진료 내역을 관리하고, 환자 |
|
정보를 조회하기를 원합니다. |
 |
 |
원무과 직원은 이 시스템을 통해 진료비 청구서를 조회,발행하고, 진료예약을 |
|
확정하기를 원합니다. | | | | | | |
|
 |
오퍼레이션,속성과 관계 수는 생략된 상태입니다. |
 |
 |
가장 초기상태(Conceptual Level)에 해당되는 모델입니다. |
 |
 |
이 클래스들은 모두 <<entity>> 형 클래스입니다. |
 |
 |
상세화가 진행되면 여기에 추가로 <<control>>과 <<boundary>> 클래스가 |
|
부가되어 사례2와 같은 형태가 됩니다. | | |
작성단계 및 유의사항
|
|
|
 |
 |
|
다음은 클래스 다이어그램 작성시 주의사항입니다. |
 |
 |
모델의 단순성을 유지하도록 합니다. |
 |
|
불필요하게 복잡한 클래스 다이어그램이 되지 않도록 단순성을 유지하는 것이
좋습니다. |
 |
 |
의미있는 이름을 부여하도록 합니다. |
 |
|
클래스 명, 속성 명, 오퍼레이션 명, 관계 명 등은 직관적으로 의미가 이해될 수
있도록 의미있는 이름으로 정해야 합니다. 명칭은 모호하지 말아야 하고 명확해야
함은 물론입니다. |
 |
 |
포인터나 레퍼런스는 관계성으로 대신합니다. |
 |
|
Association은 그 자체가 상대 클래스의 인스턴스에 대한 포인터나 레퍼런스의
의미를 이미 가지고 있기 때문에 별도로 정의할 필요가 없습니다. |
 |
 |
여러 클래스가 동시에 관계를 가지는 association의 경우는 이를 둘 간의 관계로 |
|
분리하는 것이 좋습니다.
세 클래스 이상이 한꺼번에 관계를 가지는 것이 가능합니다. 그러나 이는 구현과정이
어렵기 때문에 미리 두 클래스의 관계로 분리하는 것이 좋습니다. |
 |
 |
관계 수는 복잡하지 않게 정의하는 것이 좋습니다. |
 |
 |
객체모델은 많은 반복 작업을 통하여 완성합니다. |
|
빈번한 클래스 다이어그램의 수정을 두려워하지 않도록 합니다. 클래스
다이어그램은 많은 반복 작업을 통하여 완성되는 것임을 명심합시다. | | | |