Creative Commons License

Software Dev

프로그래밍기본
객체지향
프로젝트관리
알고리즘
데이타베이스

소프트웨어 개발에 필수적이고 필요한 주제에 대한 강의 및 공유

.

객체지향

객체재향 프로그래밍 패러다임과 각종 기법 및 방법론에 대해 다룹니다

[UML] Class Diagram

작성자 : 박종명
최초 작성일 : 2008-05-14 (수요일)
최종 수정일 : 2008-05-14 (수요일)
조회 수 : 4470

  

Key Word

Class Diagram

명사(동사), 클래스들의 의존관계,시스템 구성요소 파악, 실제코드와 바로 순환

 

1. 명사,명사 그리고 동사

소프트웨어 개발은 비지니스의 이해부터 출발한다.

소프트웨어 개발의 선 과정인 분석과정이 필요한 이유도 비즈니스를 정확히 이해해야 하기 때문이다.
만일 개발자가 전혀 경험하지 않는 비즈니스를 위한 소프트웨어를 만든다고 가정한다면 섣불리 코딩부터 하는 어색한 행동을 하지 않을 것이다.

 

사실 개발자들은 너무 많은 비즈니스를 경험했고 그에 못지 않게 비즈니스를 너무 소홀하게 대한다.

솔루션의 본질이 특수한 비즈니스를 해결할 목적인 이상 비즈니스 이해도가 소프트웨어의 질과
직접적으로 관련있다는 것은 의심할 여지가 없다
.

비즈니스의 이해 , 업무 도메인의 이해는 소프트웨어 개발의 첫 단추이다.

조금 아는 것이 모르는 것보다 못하단는 말 처럼 비즈니스에 대한 약간의 지식이 비즈니스 이해를 위한 분석과정을 무시하는 최악의 상황을 유발시킨다.

 

비즈니스 도메인에 대한 이해를 위해 실제 비즈니스를 담당하는 담당자 또는 시스템 개발을 의로한 의로인등과의 상담(회의)을 하게 된다. 이 때 상대방이 자신의 업무를 우리에게 이해 시키기 위해 내 뱉는 명사들은 실제 시스템의 클래스가 될 가능성이 크다. 물론 모든 명사가 클래스가 되지는 않을 것이다. 일부는 클래스의 속성이 될 수도 있으며 또 일부는 아무런 의미없는 단순히 명사일 뿐인 것도 있을 것이다. 그리고 상대방이 내 뱉는 말 중 동사들은 실제 클래스의 오퍼레이션이 될 수 있는 가능성이 크다

 

1.1 소스코드와 직결되는 클래스 다이어그램

객체 지향 프로그래밍에서는 수 많은 클래스들이 존재하며 각 클래스들을 고유의 역할과 상호 의존관계를 가지고 있다. 시스템 내의 구성요소 및 객체들의 특성, 상호 의존 구조를 소스코드만으로 이해하기란 거의 불가능에 가깝다.

클래스 다이어그램은 한 눈에 시스템에 등장하는 클래스와 그 들의 관계 및 구조를 쉽게 이해할 수 있도록 해주는 중요한 수단이 된다.

 


1.2
객체는 클래스로부터 탄생된다.

그 유명한 붕어빵 기계는 클래스와 객체를 비유하는 좋은 예이다. 붕어빵 기계는 클래스가 되고 붕어빵은 객체가 된다. 이처럼 객체는 클래스의 산물인 것이다. UML 의 많은 다이어그램에 객체가 존재 한다.

물론 시스템 측면의 객체가 아닌 비즈니스 측면의 객체가 다이어그램들에 등장할수도 있지만 실제 코드를 구현하기 위한 객체는 명확히 클래스로부터 만들어 져야 한다. 이렇듯 객체지향 시스템의 가장 중요한 정보 처리 단위는 바로 클래스이다. 따라서 객체가 등장하는 다이어그램 이전에, 혹은 비즈니스 객체를 실제 시스템 객체로 전환 시 , 업무 도메인의 분석과정등에서 클래스 다이어그램이 만들어지므로 많은 다이어그램 중 우선순위가 비교적 높다고 할 수 있다.

 

 

2. 클래스(Class) 다이어그램

실 세계의 개념을 그대로 옮기고 싶어했던 객체지향 시스템의 기본은 클래스이다.클래스는 유사한 속성과 행위를 가진 동일 범주에 대한 추상화로 정의할 수 있다.

 

두 발로 걷고 말을 하고 생각을 하고 웃을 수 있는 동물을 추상화 하면 인간이 된다.

이때 인간은 클래스라 할 수 있고 홍길동은 인간 클래스로부터 탄생된 객체라고 할 수 있다

 

 

2.1 클래스 나타내기


클래스는 자신의 이름과 속성, 오퍼레이션으로 구성된다. 아래 다이어그램은 Class1 이라는 이름의 클래스에 속성과 오퍼레이션이 하나씩 정의된 모습이다 구획 3개로 나누어 클래스명/속성/오퍼레이션을 표현한다.


 

√ 클래스 명

클래스의 이름은 보편적으로 첫문자를 대문자로 표시한다. 만일 복합명사인 경우에는 첫 문자와 다음 명사의 첫문자도 대문자로 시작하도록 한다. 또한 공백을 허용하지 않는다. 만일 게시판 관리자라는 역할을 클래스를 만든다면 위의 규칙에 따라 BoardManager’ 쯤 될것이다.

 

√ 속성

속성은 이 클래스가 가진 특성에 이름을 붙인 것이다. 만일 사람(Person) 이라는 클래스가 있다면 나이(Age) 는 속성이 될 수 있다. 속성은 첫문자를 소문자로 시작함을 규칙으로 한다. 복합명사일 경우에는 다음 명사의 첫문자를 대문자로 시작하도록 한다. 또한 속성의 데이터 타입을 같이 명사할 수도 있는데 이 경우 속성명 : 데이터타입형태로 표시한다

 

√ 오퍼레이션

오퍼레이션은 객체의 행위에 해당한다. 꼭 그렇다고는 할 수 없지만 오퍼레이션은 객체의 메서드(함수)라고 생각해도 무방할 것이다. 오퍼레이션의 명명규칙은 속성과 동일하다. 오퍼레이션의 반환타입을 지정할 수도 있는데 이 경우 오퍼레이션: 반환타입형태로 표시한다

 

√ 접근 한정자

위의 클래스 다이어그램에서 속성과 오퍼레이션 앞에 +,- 기호가 있다. 이것은 각각 private, public 를 나타내는 접근 한정자 이다. (protected # 기호로 표시한다)

 

√ 그 밖의 것들

하나의 클래스를 매우 상세하기 표현하기 위해 앞서 살펴본 것 이외의 규칙도 UML 에서는 정의하고 있다.

 

① 속성의 기본값 : 속성에 기본값을 명시할 수 있다.
           ex> name : string = ‘
홍길동
ß name 이라는 string 타입의 기본값은 홍길동이다

 

② 오퍼레이션의 반환 값 : 오퍼레이션의 반환값 타입을 명시할 수 있다.

           ex> getName() : string ß getName 이라는 오퍼레이션은 string을 반환한다

 

③ 오퍼레이션의 매개변수 정보 : 오퍼레이션의 매개변수명과 타입을 명시할 수 있다.

           ex> add(count : int) ß add라는 오퍼레이션은 count 라는 정수형 매개변수를 가진다.

 

④ 패키지 명시 : 클래스가 특정 패키지에 포함되었다는 것을 명시할 수 있다.

           Ex> Class1 :: Package1 ß Class1 Package1에 포함된 클래스이다

 

 

2.2 객체 나타내기

객체는 클래스로부터 탄생하는 클래스의 인스턴스이다.


객체는 이름에 밑줄이 쳐진 형태로 표시된다. 또한 클래스 정보를 보여주기 위해 객체 : 클래스로 표시한다

만일 객체명을 지정하지 않은 익명객체를 표현하고 싶을때는 ‘ : 클래스로 표시하면 된다


 


 

3. 클래스(Class) 간의 관계 
 

시스템안에는 수많은 클래스들이 존재하며 각 클래스들은 그 나름의 고유한 의미를 가지고 있다. 클래스가 그마다 고유한 의미를 지녔다고 해도 독불장군이 될 수는 없다. 실제 인간사에도 모든 사람은 개인의 고유성과 사회라는 시스템에서의 유기적인 관계를 유지하며 살아가고 있다.
마찬가지로 시스템 내의 클래스들은 서로가 필요에 의해 필요한 만큼 연결되어 있다.

 


3.1
연관(Association)

클래스간 관계 중 가장 많이 볼 수 있는 것이 연관관계 이다.

객체 지향 언어에서 한 클래스(객체)는 다른 객체의 참조를 가지고 있는 경우가 허다하다.
한 클래스가 다른 클래스의 참조를 가진 관계를 연관 이라고 한다.


위의 예를 보면 MemberManager 클래스는 Member 클래스를 참조하고 있는 연관 관계이다.

중간의 파란 실선은 두 클래스간 연관관계를 나타내는 연결선이며, 이 선 위에 연관이름을 부여한다.

 


여기서는 MemberManager 클래스가 Member 클래스를 생성한다는 의미의 Create 라는 연관이름을부여

했다. myMember 는 참조변수의 명칭이다. 사실 연관이름은 이 둘 중 하나만 사용해도 무방하다. 상황에 적합한 연관이름을 부여하면 된다.

 

0..* 는 이 MemberManager 클래스가 Member 에 대한 참조를 몇 개 가질지(차수)를 나타낸다.

위의 예에서는 1개의 MemberManager 클래스는 다수개의 Member을 가질 수 있다는 표현이다.

 

 

3.2 의존(Dependency)

클래스의 특정 오퍼레이션(메서드라고 생각하자)의 시그너쳐에 다른 클래스가 포함되어 있다면 이를 의존관계라고 한다. 메서드의 시그너쳐는 다음과 같다.

 

public Product CreateProduct()


, 시그너쳐는 메서드의 실제 구현부를 제외한 접근한정자,반환값,함수명,매개변수를 말한다.

다음 그림처럼 Factory 클래스는 Product 클래스의 객체를 생성한다. 이와 같은 관계를 의존관계라 한다.



 

3.3 상속(Inheritance) / 구현(Implement)


객체 지향 특징 중 누구나 다 아는 특징인 상속이다.

보다 상위 수준으로 추상화된 클래스를 상속받아 보다 구체적인 클래스를 만듦으로써 재사용성과 다형성등을 추구하는 객체지향 기법이다. UML 에서도 당연히 이러한 상속구조를 표현할 수 있도록 지원한다. 객체 지향에서의 이러한 상속관계를 UML 에서는 일반화 관계라고 한다.

 

왼쪽의 예에서는 Unit(유닛) 클래스를 상속받은 zealot(질럿) 클래스를 나타낸다. zealot (질럿)Unit 을 일반화 시킨 클래스이다. UML 에서의 일반화 관계는 세모모양의 화살촉이 있는 화살표 모양으로 표시한다.




구현(implement)

클래스간의 상속과는 달리 인터페이스를 물려받은 클래스는 그 인터페이스를 구현하다 라고 한다. 인터페이스는 껍데기 뿐인 일종의 규약으로써 실제 구현은 클래스에서 이루어 지게 된다



위 예에서는 이전의 상속구조와 더불어 IAttackable(공격가능한) 인터페이스를 구현하고 있다.

일반화 관계와 구현관계의 차이점은 실선과 점선의 차이점이다.



3.4 집합연관(Aggregation) 과 복합연관(Composition)

클래스간의 연관관계 중 1 : 관계, 전체 : 부분의 관계가 있을 수 있는데 이러한 관계는집합연관/복합연관 으로 정의된다.

 

집합연관

집합연관은 말 그대로 하나의 클래스가 다수의 클래스를 가지고(포함,참조)하고 있을 경우를 말한다. 아래 그림을 보면 닷넷 Language클래스가 전체가 되고 각 언어 클래스가 부분이 되는 클래스이며 닷넷Language클래스는 각 언어 클래스들의 참조를 가진다. 집합연관의 표현은 그림에 표시되었듯이 전체에 해당하는 클래스 쪽으로 마름모형태를 표시한다.



집합연관은 앞서 살펴 본 연관 관계와 완전 동일하다.

, 차이점이라면 한 클래스가 다수의 클래스를 참조한다는 것인데 개별적인 클래스들로 보면 어차피 각각은 연관관계인 것이다. 아래 글은 ‘UML 실전에서는 이것만 쓴다에서 발췌한 내용이다.

불행하게도 UML 은 명확한 집합의 정의를 제공하지 않는다.

………

나는 집합연관을 전혀 사용하지 않으며, 여러분도 피했으면 좋겠다. 사실, 집합관계는 UML2.0 에서 빠져버렸다.

 

 

복합연관

집합연관의 또 다른 형태이다. 클래스간의 관계는 집합연관에서와 같이 전체 : 부분의 연관관계이다.

, 몇가지 제약사항들을 가지는 것이 복합연관이다. 따라서 복합연관을 강한 집합연관으로 표현하기도 한다.

 

 

- 제약 사항 -

① 부분은 하나의 전체에만 속해야 한다. (제가 모시는 행님은 단 한분 뿐 입니더! ^^;)

   위의 예에서 ‘CSharp’ 클래스 는 닷넷Language’ 클래스 이외의 클래스의 부분이 될 수 없다., 부분 클래스는 오

   직 하나의 전체 클래스에만 속할 수 있다. 아래 그림처럼 ‘CSharp’ 클래스가 두 클래스의 부분 클래스로 되면 복합

   연관이 될 수 없다.



② 전체는 부분의 수명을 책임진다 (니 목숨은 내꺼다. 죽어도 같이 죽자 --;)


위의 예에서 ‘CSharp’  객체의 수명은 닷넷 Language’ 가 책임 져야 한다.
, 닷넷 Language’ 객체가 소멸되면 ‘CSharp’ 객체도 같이 소멸되어야 한다


 

③ 전체가 가면 부분도 같이 간다(좋은데 갈 때 같이 가자 ^^;)


객체 복사 기법은 얕은 복사깊은 복사가 있다.
깊은 복사는 객체가 포함하고 있는 또 다른 객체 까지도 완전히 새롭게 복사되는 형태이다. 복합연관관계에서는 전체가 복사되면 부분도 함께 복사되어야 한다.

, 깊은 복사가 되어야 한다는 것이다

 

위의 3가지 제약사항을 수반하는 집합연관이 바로 복합연관이다.

이름
비밀번호
홈페이지
DW <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요