Top 44 Uml 화살표 13736 People Liked This Answer

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me uml 화살표 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://chewathai27.com/to team, along with other related topics such as: uml 화살표 클래스다이어그램 화살표, UML 상속 화살표, 클래스 다이어그램 툴, 클래스 다이어그램 만들기, UML 다이어그램, UML 관계 표현, UML 예시, UML 설계


소프트웨어 설계 언어 한방에 부수기 – UML
소프트웨어 설계 언어 한방에 부수기 – UML


[UML] 클래스 다이어그램 이해하기

  • Article author: sabarada.tistory.com
  • Reviews from users: 46023 ⭐ Ratings
  • Top rated: 3.5 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [UML] 클래스 다이어그램 이해하기 이런 UML은 소프트웨어를 설계하며 필요에 의해서 사용되는데 일반적으로 … 이는 클래스 다이어그램에서는 실선에 비어있는 화살표로 표시합니다. …
  • Most searched keywords: Whether you are looking for [UML] 클래스 다이어그램 이해하기 이런 UML은 소프트웨어를 설계하며 필요에 의해서 사용되는데 일반적으로 … 이는 클래스 다이어그램에서는 실선에 비어있는 화살표로 표시합니다. [UML] 클래스 다이어그램 이해하기 [UML] 시퀀스 다이어그램 이해하기 안녕하세요. 오늘은 클래스 다이어그램에 대해서 이야기 해보고자 합니다. 최근 레거시 시스템의 구조개선을 조금씩 하고 있습니다. 그러면..
  • Table of Contents:

UML 이란

클래스 다이어그램

클래스 다이어그램의 기본 요소

클래스 다이어그램을 이용한 관계 표현

마무리

참조

태그

관련글

댓글5

공지사항

최근글

인기글

최근댓글

전체 방문자

티스토리툴바

[UML] 클래스 다이어그램 이해하기
[UML] 클래스 다이어그램 이해하기

Read More

[UML] 클래스 다이어그램 작성법 – Heee’s Development Blog

  • Article author: gmlwjd9405.github.io
  • Reviews from users: 2828 ⭐ Ratings
  • Top rated: 3.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [UML] 클래스 다이어그램 작성법 – Heee’s Development Blog [UML] 클래스 다이어그램 작성법. … UML(Unified Modeling Language)이란 … 양방향은 실선으로, 단방향은 화살표로 표시한다. 화살표. …
  • Most searched keywords: Whether you are looking for [UML] 클래스 다이어그램 작성법 – Heee’s Development Blog [UML] 클래스 다이어그램 작성법. … UML(Unified Modeling Language)이란 … 양방향은 실선으로, 단방향은 화살표로 표시한다. 화살표. [UML] 클래스 다이어그램 작성법java, uml, class-diagram
  • Table of Contents:

클래스 다이어그램 작성법

Goal

클래스 다이어그램이란

클래스

관계

[UML] 클래스 다이어그램 작성법 - Heee's Development Blog
[UML] 클래스 다이어그램 작성법 – Heee’s Development Blog

Read More

UML 클래스 다이어그램 이해하기

  • Article author: morm.tistory.com
  • Reviews from users: 36489 ⭐ Ratings
  • Top rated: 4.6 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about UML 클래스 다이어그램 이해하기 상담의사와 환자를 예로 들 수 있습니다. 2. 일반화 관계(generalization). 표시 : 속이 빈 화살표 설명 : 객체지향 개념에서 상속관계라고 말합니다. 한 … …
  • Most searched keywords: Whether you are looking for UML 클래스 다이어그램 이해하기 상담의사와 환자를 예로 들 수 있습니다. 2. 일반화 관계(generalization). 표시 : 속이 빈 화살표 설명 : 객체지향 개념에서 상속관계라고 말합니다. 한 … [UML] 클래스 다이어그램 작성법 – Heee’s Development Blog Step by step goes a long way. gmlwjd9405.github.io UML 클래스 다이어그램 기본상식 ( C# ) 본격적인 GOF의 디자인 패턴을 분석하기 전에, GOF의 디..
  • Table of Contents:

UML 클래스 다이어그램 이해하기

티스토리툴바

UML 클래스 다이어그램 이해하기
UML 클래스 다이어그램 이해하기

Read More

UML: 클래스 다이어그램과 소스코드 매핑

  • Article author: www.nextree.co.kr
  • Reviews from users: 25350 ⭐ Ratings
  • Top rated: 4.6 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about UML: 클래스 다이어그램과 소스코드 매핑 Updating …
  • Most searched keywords: Whether you are looking for UML: 클래스 다이어그램과 소스코드 매핑 Updating
  • Table of Contents:

1 UML

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

3 클래스 다이어그램의 요소(Element)

Abstract ClassMethod (추상 클래스 메서드)

4 클래스간의 관계

5 마치며

예제 자료

참조 도서 및 사이트

UML: 클래스 다이어그램과 소스코드 매핑
UML: 클래스 다이어그램과 소스코드 매핑

Read More

고급자바_클래스 다이어그램

  • Article author: velog.io
  • Reviews from users: 8088 ⭐ Ratings
  • Top rated: 3.4 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 고급자바_클래스 다이어그램 Updating …
  • Most searched keywords: Whether you are looking for 고급자바_클래스 다이어그램 Updating uml : 시스템을 모델로 표현해주는 대표적인 모델링 언어uml 다이어그램 종류 구조다이어그램 : 클래스다이어그램, 객체다이어그램, 복합체구조다이어그램, 배치다이어그램, 컴포넌트다이어그램, 패키지다이어그램행위다이어그램 : 활동다이어그램, 상태머신다이어그램, 유즈케이스다
  • Table of Contents:

JAVA_고급

UML 다이어그램 종류

클래스

관계

고급자바_클래스 다이어그램
고급자바_클래스 다이어그램

Read More

UML 분석 설계 실무 – 전병선 – Google Sách

  • Article author: books.google.com.vn
  • Reviews from users: 14759 ⭐ Ratings
  • Top rated: 3.2 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about UML 분석 설계 실무 – 전병선 – Google Sách Updating …
  • Most searched keywords: Whether you are looking for UML 분석 설계 실무 – 전병선 – Google Sách Updating 이 책은 와우북스에서 종이책으로 출간되었습니다. 그리고 이 책에는 epub 버전과 pdf 버전이 모두 포함되어 있습니다. 표시 옵션 보기에서 스캔 페이지를 선택하면 종이책과 동일한 pdf 버전을 보실 수 있습니다. 맞춤 텍스트는 epub 버전으로 수정 사항이 수시로 업데이트됩니다.   이 책은 UML의 핵심 만을 추려서 설명하고 실무에서 소프트웨어 시스템의 분석과 설계에 UML을 활용하는데 어려움이 없도록 하는 것이 목적으로 한다. 그래서 UML 모델링 개념을 이해하고 모델링 도구를 사용한 UML 모델링 방법에 익숙하게 하며, UML을 활용하여 객체지향 기반의 소프트웨어 시스템 분석과 설계 방법론 과정을 설명하고 각 방법론 프로세스 단계마다 분석 및 설계를 위한 UML 모델링에 대한 가이드를 제공한다. 
  • Table of Contents:
UML 분석 설계 실무 - 전병선 - Google Sách
UML 분석 설계 실무 – 전병선 – Google Sách

Read More

적정 소프트웨어 아키텍처: 리스크 주도 접근법 – 조지 페어뱅크스 – Google Sách

  • Article author: books.google.com.vn
  • Reviews from users: 19272 ⭐ Ratings
  • Top rated: 3.8 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 적정 소프트웨어 아키텍처: 리스크 주도 접근법 – 조지 페어뱅크스 – Google Sách Updating …
  • Most searched keywords: Whether you are looking for 적정 소프트웨어 아키텍처: 리스크 주도 접근법 – 조지 페어뱅크스 – Google Sách Updating 소프트웨어 개발자를 위한 실용 가이드 이 책은 소프트웨어 개발을 시작할 때 필요한 실용 가이드북이다. 소프트웨어 아키텍처의 리스크는 무엇인지, 아키텍처 설계 원칙은 어떻게 적용하고 해결하는지, 유관 부서의 실무자를 어떻게 도울 수 있는지 등의 주제를 개발자가 흔히 겪는 경험을 기반으로 풀어냈다. 개발하면서 너무 많은 문서를 작성했거나, 코딩을 시작하기 전에 너무 적게 고민한 적도 있을 것이다. 어느 쪽이든 소프트웨어 개발이 왜 잘못되는지 알 수 있고, 이 책에서 제공하는 해결책이 많은 도움이 될 것이다.리스크 관리 중심의 적정한 설계를 위한 소프트웨어 아키텍처 가이드 처음부터 완벽한 소프트웨어 개발 설계 방법이 있을까? 이 책은 설계의 적정한 수준은 무엇이며, 리스크 관리 중심으로 아키텍처를 설계하는 방법은 무엇인지, 어떻게 전략적으로 자신의 프로젝트에 적용할 수 있는지 자세히 설명한다. 다루는 내용과 수준은 실무 소프트웨어 개발자뿐 아니라 미숙한 개발자나 고학년 학부생까지 총망라한다. 소프트웨어 아키텍처의 필수 개념, 아키텍처 설계를 수행하는 추천 시기와 현실적인 조언, 다양한 모델과 스타일, 리스크 관리 중심의 설계 적용 방법을 배우고 여러분의 아키텍처 설계에 필요한 실용적이고 적절한 해결책을 찾길 바란다.   주요 내용리스크 주도 아키텍처링: 직면한 리스크에 따라 적정한 아키텍처 설계를 수행하는 방법참여하는 아키텍처: 아키텍트뿐 아니라 모든 소프트웨어 개발자를 위한 아키텍처선언적 지식: 기법을 적재적소에 사용하기 위한 개념과 용어엔지니어링 강조: 소프트웨어 개발의 기술적인 부분과 시스템 작동을 위한 엔지니어링실용적인 활용 방법: 상위 아키텍처부터 하위 자료 구조 설계까지 다양한 수준의 모델을 활용하는 접근 방법 추천사 명쾌한 설명과 흥미로운 사례가 넘친다. 일찍부터 이 책이 있었다면 상당히 많은 실수를 피할 수 있었을 것이다. 더 나은 소프트웨어 아키텍처가 되고 싶다면 이 책을 항상 곁에 두길 바란다._티머시 핼러런 박사, SureLogic 엔지니어링 디렉터 이 책은 소프트웨어 아키텍처를 쉽게 적용하고 실용적으로 만드는 독특한 관점을 제시한다. 적정 아키텍처와 리스크 주도 설계의 개념은 획기적인 아이디어다. 이 책은 아키텍처 원칙을 실제 사례에 효과적으로 적용할 수 있는 방법을 보여준다. 소프트웨어 개발 분야에서 일하는 모든 사람이 반드시 읽어야 할 매우 유용한 책이다._마커스 폰토라 박사, Yahoo! 리서치 수석 연구원 및 아키텍트
  • Table of Contents:
적정 소프트웨어 아키텍처: 리스크 주도 접근법 - 조지 페어뱅크스 - Google Sách
적정 소프트웨어 아키텍처: 리스크 주도 접근법 – 조지 페어뱅크스 – Google Sách

Read More


See more articles in the same category here: Chewathai27.com/to/blog.

[UML] 클래스 다이어그램 이해하기

안녕하세요. 오늘은 클래스 다이어그램에 대해서 이야기 해보고자 합니다. 최근 레거시 시스템의 구조개선을 조금씩 하고 있습니다. 그러면서 객체의 구성 및 도메인 모델을 어떻게 가져가야할지 고민을 하게 되었습니다. DDD 관련된 책이라던지 찾아보는데 이때 기본이 되는게 UML, 특히 클래스 다이어그램 이라는 것을 알 수 있었습니다. 지끔까지는 막연한 지식은 있지만 이번 기회에 명확하게 이를 이해하고자 UML, 그 중에서도 클래스 다이어그램에 대해서 정리해보고자 합니다.

UML 이란

먼저 UML이란 Unified Modeling Language의 약자로 도메인(해결하고자 하는 목표, ex) 결재시스템 등)을 모델로 표현해주는 대표적인 모델링 언어로 알려져 있습니다. 이런 UML은 소프트웨어를 설계하며 필요에 의해서 사용되는데 일반적으로 아래 3가지의 목적을 가지고 만듭니다.

의사소통 또는 설계 논의를 위해

전체 시스템의 구조 및 클래스의 의존성 파악을 위해

유지보수를 위한 설계의 back-end 문서 제작을 위해

클래스 다이어그램

UML 중에서도 오늘 알아 볼 클래스 다이어그램 은 정적 다이어그램으로 클래스의 구성요소 및 클래스간의 관계를 표한하는 대표적인 UML입니다. 이를 통해 시스템의 일부 또는 전체의 구조를 나타낼 수 있습니다. 그리고 클래스 다이어그램 을 이용하면 의존 관계를 명확히 보게 해주며, 순환 의존이 발생하는 지점을 찾아내서 어떻게 이 순환고리를 깰 수 있을지 결정할 수 있게 해줍니다.

클래스 다이어그램은 2가지 용도로 사용될 수 있습니다. 첫번째는 문제 해결을 위한 도메인 구조를 나타내어 보이지 않는 도메인 안의 개념과 같은 추상적인 개념을 기술하기 위해 나타낸 것입니다. 두번째는 소프트웨어의 설계 혹은 완성된 소프트웨어의 구현 설명을 목적으로 사용할 수 있습니다. 아래 이미지의 왼쪽이 첫번째 목적을 위해 사용하는 방법이며 오른쪽이 두번째 목적을 위해 사용하는 방법입니다.

클래스 다이어그램의 활용

클래스 다이어그램의 기본 요소

클래스 다이어그램을 그리기 위한 기본요소에 대해서 알아보도록 하겠습니다. 클래스에는 클래스의 이름, 속성, 그리고 메서드가 존재합니다. 이런 요소들은 어떻게 클래스 다이어그램에 표현할 수 있을 까요?

접근제어자 리스트

+ : public

– : private

# : protected

형식

속성(Attribute) 접근제어자 이름: 타입 = 기본값 ex) -title: String = “”

메서드 접근제어자 이름(파라미터 속성): 리턴값 ex_1) +setTitle(String) ex_2) +getTitle(): String

interface와 abtsract(추상화)와 같은 요소들은 <<>> 을 이용해서 <> 또는 <> 로 나타낼 수 있습니다. 이렇게 기본적인 요소를 알아보았습니다.

클래스 다이어그램을 이용한 관계 표현

참조 : http://www.nextree.co.kr/p6753/

클래스간의 연관관계는 위 7가지로 나타낼 수 있습니다. 각각이 어떤 관계를 의미하는지, 그리고 클래스 다이어그램으로 어떻게 표현되는지 알아보도록 하겠습니다.

Generalization ( 일반화 )

Generalization은 우리가 일반적으로 알고 있는 상속을 의미합니다. 이는 클래스 다이어그램에서는 실선에 비어있는 화살표로 표시합니다.

이러한 도메인 모델을 코드로 구현하면 아래와 같습니다.(get, set 메서드는 생략하도록 하겠습니다.)

public class Board { private String title; private String contents; private List comments; // 기본 getter / setter 메서드들 } class SchedulerBoard extends Board { private LocalDate startDate; private LocalDate endDate; public void validateDateLine() { … } }

Realization ( 실체화 )

Realization은 interface에 있는 spec을 오버라이딩하여 실제로 구현하는 것을 말합니다. Realization은 점선과 비어있는 화살표로 표현합니다.

위 다이어그램의 오른쪽과 왼쪽은 모두 동일한 의미를 가집니다. 코드로 구현하면 아래와 같습니다.(Board의 attribute는 구현 생략하였습니다.)

public interface OpenCloseable { void open(); void close(); } public class Board implements OpenCloseable { public void open() { System.out.println(“open method”); } public void close() { System.out.println(“close method”); } }

Dependency ( 의존 )

Dependency는 클래스간의 참조가 일어나는 것 중 하나입니다. Dependency 참조는 메서드 내에서 대상 클래스의 객체를 생성하거나 사용, 리턴받아 사용하는 것을 말합니다. 그리고 이 참조는 해당 클래스와의 관계를 계속 유지하지 않습니다. dependency는 점섬과 화살표로 이루어져 있습니다.

코드로 표현하면 아래와 같습니다.

public class Board { private String title; public String getTitleWithRanking(Ranking ranking) { return title + ranking.getRank(); } } public class Ranking { private int rank; public int getRank() { return rank; } }

Dependency는 메서드의 호출이 끝나면 연관된 클래스와의 관계가 마무리된다는 것이 중요합니다.

Association & Direct Association ( 연관 )

클래스 다이어그램에서의 Association은 다른 객체의 참조를 가지는 필드를 의미합니다. 실선으로 표현되며 방향성이 존재하는 경우에는 화살표를 넣어 표시합니다. 그리고 둘의 연관관계가 어떻게 되는지 숫자로 표시할 수 있습니다.

연관관계의 숫자 표현은 아래와 같이 합니다.

1 – 1개의 표현

* – 0 ~ n 개의 표현

n…m : n 부터 m까지 연관관계를 맺음

아래 예제는 양방향 연관관계를 가지며 1(Board) : n(Comment)의 관계를 표시한 것입니다.

아래의 코드는 위의 이미지를 코드로 구현한 것입니다.

public class Board { private List comments; public void addComment(Comment comment) { comments.add(comment); } } public class Comment { private Board board; public void setBoard(Board board) { this.board = board; board.addComment(this); } }

Aggregation ( 집합 ) & Composition (합성)

클래스 다이어그램에서 Aggregation과 Composition은 Association의 특수한 관계입니다. Aggregation은 Association의 집합관계를 나타내는 것으로 Collection이나 Array를 이용하는 관계입니다. 하지만 이 관계는 일반적인 Association으로도 충분히 나타낼 수 있는 관계입니다. 우리가 위에서 Association의 예제가 바로 1 : N 연관관계를 나타낸 것입니다. Aggregation과 Association의 모호성은 지속적으로 논란이 되고 있지만 결론이 나지 않았다고 합니다. 논란

Aggregation은 실선에 빈 다이아몬드로 나타냅니다.

Composigiton은 클래스 연관관계에서 강한 결합의 관계를 의미합니다. 즉, 참조하는 클래스의 라이프 사이클이 종속적이라는 말입니다. 다이어그램으로는 실선에 채워져있는 다이아몬드로 표시합니다.

조금 억지스럽기는 하지만 rank class Board에 종속적인 상황입니다. 코드는 아래와 같습니다.

public class Board { private Ranking rank; public Board() { rank = new Rank(); } public void calculateRanking() { System.out.println(rank.calculateRanking()); } } public class Ranking { private int rank; public int calculateRanking() { … [logic] … return rank; } }

위코드는 Rank class가 rank를 관리하며 관련 class를 Board에서 생성하고 사용하는 코드입니다. 이렇게 되면 Board가 사용하지 않는 경우가 발생했을때 자연스럽게 Rank도 참조가 불가능한 상태가 됩니다. 일반적인 Association(Aggregation) 상황에서는 외부에서 가져오기 때문에 1번 Board Class가 죽더라도 Comment의 경우 다른곳에서 참조할 수 있는것과 다릅니다.

마무리

오늘은 이렇게 UML 중 클래스 다이어그램에 대해서 알아보았습니다. 클래스 다이어그램은 소프트웨어 구조 분석에 기본이 되는 지식으로 알아두시면 도움이 되실 것 같습니다.

감사합니다.

참조

http://www.nextree.co.kr/p6753/

https://nirajrules.wordpress.com/2011/07/15/association-vs-dependency-vs-aggregation-vs-composition/

UML 클래스 다이어그램 이해하기

반응형

*이 글은 위 링크의 공부를 목적으로 내용을 필사하거나 정리했습니다.

최근 튜토리얼을 따라하면서 유연한 클래스의 작성이 중요하단 생각이 들었습니다. 어떻게 하면 이 튜토리얼처럼 유연하게 클래스를 구성할 수 있을지 고민하다가 문득 UML 다이어그램이 생각났습니다. 얼핏 들어보기만 했던 거였는데, 이걸 활용하면 클래스를 좀 더 넓은 시야로 바라볼 수 있을거란 생각이 들었습니다.

또 튜토리얼을 단지 따라하는 선에서 그치는게 아닌 튜토리얼의 내용을 더욱 내 것으로 소화시키기 위해서 클래스를 그림으로 기억하는 것도 꽤 훌륭한 방법인것 같아습니다.

이런 이유로 UML 클래스 다이어그램이 무엇인지 알아보게 됐습니다.

클래스 다이어그램이란

시스템을 구성하는 클래스들 사이의 관계를 표현해주는 그림 도식입니다.

클래스의 표현

클래스는 3가지 칸으로 구성됩니다. 가장 윗 부분에는 클래스 명이 들어가고, 중간 부분에는 속성(클래스의 특징, 변수)이 들어갑니다. 마지막 부분에는 연산(메서드, 클래스가 수행하는 책임)이 들어갑니다.

그림으로 보면 이렇습니다.

Player +moveSpeed -moveDir #targetPosition -Move() +TraceTarget()

경우에 따라서 속성(변수)과 연산(함수)부분은 생략하기도 합니다. 예를 들어 속성으로 흐름을 분석하기 위해 다이어그램을 쓰는 경우에요.

위에서 이름 앞에 -,+,#과 같은 기호들이 작성됐는데 순서대로 private, public, protected를 의미합니다.

이렇게 다이어그램을 표현할 때 분석 단계와 설계 단계에서의 표현 방식이 다소 다릅니다.

클래스 간 관계

UML에서 제공하는 클래스들 사이의 관계는 아래와 같습니다.

1. 연관 관계(association)

표시 : 실선이나 화살표

설명 : 클래스들이 개념상 서로 연결됐음을 나타낸다. 보통은 한 클래스가 다른 클래스에서 제공하는 기능을 사용하는 상황일 때 표시한다.

– 한 클래스가 다른 클래스와 연관 관계를 가지면 각 클래스의 객체는 해당 연관 관계에서 어떤 역할을 수행합니다. 이 때 두 클래스의 역할 표현을 역할 관계 이름이라 부릅니다. 또한 연관관계는 방향성을 가지고 있습니다. 양방향은 실선으로, 단방향은 화살표로 표시됩니다.

– 단방향(화살표)의 경우 한 쪽은 알지만 다른 쪽은 상대방의 존재를 모릅니다. 사람과 핸드폰의 관계를 예로 들 수 있습니다.

– 양방향(실선)의 경우 두 클래스의 객체들이 서로를 인지합니다. 상담의사와 환자를 예로 들 수 있습니다.

2. 일반화 관계(generalization)

표시 : 속이 빈 화살표

설명 : 객체지향 개념에서 상속관계라고 말합니다. 한 클래스가 다른 클래스를 포함하는 상위 개념일 때 이를 IS-A 관계라고 하며 UML에서는 일반화 관계로 모델링합니다.

– 한 클래스가 다른 클래스를 포함하는 상위 개념일 때 두 클래스 사이에는 일반화 관계가 존재합니다. 이를 객체지향 개념에선 상속관계라고 합니다.

– 부모 클래스는 추상적인 개념이며, 삼각형 표시가 있는 쪽을 의미합니다.

– 자식 클래스는 추상적인 개념을 물려받은 구체적인 개념입니다. 삼각형 표시가 없는 쪽입니다. 부모 클래스는 자식 클래스의 공통적인 속성과 연산을 제공하는 틀입니다.

3-1. 집합관계 – 집약 관계(aggregation)

표시 : 속이 빈 다이아몬드

설명 : 클래스들 사이의 전체 또는 부분 같은 관계를 나타냅니다. 전체 객체의 라이프타임과 부분 객체의 라이프 타임은 독립적입니다. 즉, 전체 객체가 사라져도 부분 객체는 남아있습니다. (라이프 타임 독립적)

3-2. 집합관계 – 합성 관계(composition)

표시 : 속이 찬 다이아몬드

설명 : 클래스들 사이의 전체 또는 부분 같은 관계를 나타냅니다. 전체 객체의 라이프 타임과 부분 객체의 라이프 타임이 의존적입니다. 즉, 전체 객체가 사라지면 부분 객체도 함께 사라집니다. (라이프 타임 의존적)

4. 의존 관계(dependency)

표시 : 점선 화살표

설명 : 연관 관계와 같이 한 클래스가 다른 클래스에서 제공하는 기능을 사용할 때 나타냅니다. 연관 관계와 차이점은 두 클래스의 관계가 한 메서드를 실행하는 동안과 같은, 매우 짧은 시간만 유지된다는 점입니다.

연관 관계와 의존 관계가 헷갈릴 수 있습니다. 둘 모두 한 클래스에서 다른 클래스를 사용하기 때문입니다. 결정적인 차이는 연관 관계는 클래스A가 클래스B를 멤버 변수로 가지고 있고, 의존 관계는 클래스A가 클래스 B의 메서드를 가지고 있습니다. 혹은 클래스 B를 메서드의 인자로 받습니다.

5. 실체화 관계(realization)

표시 : 빈 삼각형과 점선

설명 : 책임들의 집합인 인터페이스와 이 책임들을 실제로 실현한 클래스들 사이의 관계를 나타냅니다.

인터페이스란 책임입니다. 어떤 객체의 책임이란 객체가 해야 하는 일 혹은 객체가 할 수 있는 일을 의미합니다. 인터페이스의 경우 클래스 명에 <>를 달아줍니다. 그리고 인터페이스도 마찬가지로 객체 지향 개념에서 일반화 관계에 속합니다.

클래스간 관계 : EX 스타크래프트

마지막으로 클래스간의 관계 일반화 관계(Generalization), 실체화 관계(Realization), 연관 관계(Association), 의존 관계(Dependency)에 대해서 스타크래프트 예제를 통해 살펴보겠습니다.

1. 일반화 관계 (Generalization)

이 경우 마린이나 매딕이 상위 클래스인 Unit을 상속받습니다. Unit에선 Name, Health를 추상적으로 선언합니다. 그리고 메소드로 Move()를 선언합니다. 마린과 매딕은 유닛에서 상속받은 것 말고도 각자의 특수한 스킬이나 액션에 따른 다른 멤버 변수를 선언 할 수 있습니다. 이는 메서드를 추가하여 구현하거나, 상속받은 메서드를 추상 오버라이드해서 구현할 수 있습니다.

2. 실체화 관계 (Realization)

실체화 관계는 인터페이스 구현을 표현합니다. 인터페이스도 일반화 관계와 마찬가지로 상속을 하기 때문에 비슷한 개념에 혼동이 올 수 있습니다. 상속과 인터페이스의 다른 점은 상속은 직접 상위 클래스를 받아서 해당 클래스의 기능과 멤버 변수, 메소드 등을 상속받아 포함시킵니다. 인터페이스는 서로 완전히 다른 클래스라도 인터페이스만 준수하면 동일한 기능들이 구현 될 수 있습니다. 단, 멤버변수는 포함되지 않습니다.

위 내용을 보시면 Building을 Barracks, Factory, Bunker에서 상속받습니다. 고로 세 건물은 Building의 Health와 Ammor 멤버 변수를 받아오고 Construct(), UnderAttak()기능도 부여받습니다. 이 때 테란의 특수기능 건물 띄어서 이동하기를 구현하려합니다. 이 기능을 똑같이 Building에 메서드로 추가하게 되면 Bunker도 띄어지는 건물이 되버리는 상황이 되버립니다. Bunker는 이동이 불가능해야합니다. 이 문제 해결을 위해 인터페이스를 사용하여 특정 기능을 특정 클래스에 약속 시킬 수 있습니다. Barracks와 Factory는 IBuilingMove의 Move(), Land(), Fly()를 반드시 사용해야합니다.

3. 연관 관계(Associaion)

단방향과 양방향이 존재합니다. 단방향은 대상이 자신의 클래스를 모르는 상황에 쓰이며, 양방향은 서로 연관돼 있는 상태에 쓰입니다.

첫 번째 연관관계에서 마린은 총이라는 클래스를 멤버 변수로 가지고 있지만, Gun은 마린이 있다는 사실도 모릅니다.

두 번째 집합관계 – 집약관계를 나타냅니다. Factory가 파괴돼도 FactoryAddOn은 독립적으로 남아있습니다.

세 번째 집합질문 – 합성관게를 나타냅니다. 라이프 사이클이 서로 갇습니다.

4. 의존 관계(Dependency)

위 경우 한 객체가 다른 객체를 소유하진 않습니다만, 다른 객체의 변경에 따라 같이 변경을 해줘야합니다. 일반적으로 아래의 상황일때 사용하게 됩니다.

(1) 다른 객체를 파라미터로 받아서 그 메서드를 사용합니다.

(2) 객체의 메서드 안에서 다른 객체를 생성해서 리턴합니다.

반응형

UML: 클래스 다이어그램과 소스코드 매핑

불과 몇 년 되지 않은 학생 시절… 처음으로 UML을 접했고, UML의 기초적인 그리는 법과 사용법을 배웠습니다. 개인적으로 쉽지 않은 수업이었는데 그 중 가장 많이 사용되는 클래스 다이어그램에서 클래스간의 relationship(관계)가 제일 어려웠습니다.Generalization(일반화)과 Realization(실체화)은 명확하기 때문에 이해하는데 어려움이 없었고 Dependency(의존) 부터 조금 어려워 지더니 Association(연관)과 Aggregation(집합), Composition(합성) 3종 세트에 가서는 머리가 복잡해졌습니다. 특히 Aggregation과 Composition이 논리적으로 약하고 강한 집합이라는 차이는 알겠지만 ‘그래서 어떤 명확한 차이점이 발생하는 거지? 저걸 코드로 만들 때는 어떻게 만들어야 하는 거지?’라는 생각과 함께 잘 와 닿지 않았습니다.

그래서 2013년 9월에 진행 됐던 ‘2013 넥스트리 신입사원 인큐베이션 세미나’에서 발표 주제를 UML 클래스 다이어그램으로 정하고 그 동안 배운 것들과 추가로 공부를 더한 것들로 발표를 했고, 많은 도움이 됐던 시간이었습니다. 세미나 발표 후 몇가지 내용에 대한 아쉬움이 있었는데, 이번 기회에 그 아쉬움과 부족했던 부분을 보완하여 글로 정리하게 되었습니다. UML 클래스 다이어그램의 기본적인 요소들과 클래스간의 관계, 그리고 제가 제일 어려웠던 이 관계들을 어떻게 코드로 나타내어야 할지에 대해서 썼으며 언어는 Java 기준으로 하였습니다.

1. UML

UML이란 Unified Modeling Language의 약자로 1997년 OMG(Object Management Group)에서 표준으로 채택한 통합모델링언어 입니다. 즉, 모델을 만드는 표준언어인 것입니다. 모델이란 것은 어떤 것을 실제로 만들 때 이렇게 만들면 잘 작동할지 미리 검증해 보는 것이며 실제 물건을 만드는 비용보다 비용이 훨씬 적을 경우에 모델을 만들어 설계를 검사합니다.

소프트웨어에서의 모델은 건축, 항공 등의 모델과는 좀 다른 면이 있습니다. 건물을 짓고, 항공기를 만드는 것과 설계를 그리고 만드는 것은 비용의 엄청난 차이가 있습니다. 하지만 UML 다이어그램을 그리며 모델을 만드는 일은 개발보다 비용이 적긴 하지만 훨씬 적게 드는 것이 아니며 때로는 오히려 개발보다 비용이 더 많이 들 수도 있습니다. 그래서 UML은 시험해 볼 구체적인 것이 있고, 그것을 코드로 시험해 보는 것보다 UML로 시험해 보는 쪽이 비용이 덜 들 때 주로 사용합니다. 이러한 목적으로 UML을 사용하는 유형에는 다음 3가지 정도가 있습니다.

다른 사람들과의 의사소통 또는 설계 논의

전체 시스템의 구조 및 클래스의 의존성 파악

유지보수를 위한 설계의 back-end 문서

UML을 그리는데 가장 좋은 도구는 종이와 펜이라는 말이 있듯이 습관적으로 만드는 게 아니라 필요에 의해 만드는 것이 가장 좋은 것 같습니다.

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

[그림 1] UML 다이어그램의 종류 출처: http://www.ask.com/wiki/Unified_Modeling_Language#UML_2.x

UML은 구조 다이어그램 7개, 행위 다이어그램 7개로 총 14종류의 다이어그램이 있습니다. 구조 다이어그램은 시스템의 개념, 관계 등의 측면에서 요소들을 나타내고 각 요소들의 정적인 면을 보기 위한 것이고 행위 다이어그램은 각 요소들 혹은 요소들간의 변화나 흐름, 주고받는 데이터 등의 동작을 보기 위한 것으로, 클래스 다이어그램은 구조 다이어그램에 해당합니다. 클래스 다이어그램은 클래스 내부의 정적인 내용이나 클래스 사이의 관계를 표기하는 다이어그램으로 시스템의 일부 또는 전체의 구조를 나타낼 수 있습니다. 클래스 다이어그램은 의존 관계를 명확히 보게 해주며, 순환 의존이 발생하는 지점을 찾아내서 어떻게 이 순환 고리를 깨는 것이 가장 좋은지 결정할 수 있게 해줍니다.

[그림 2] 목적 별 클래스 다이어그램

UML은 목적에 따라 다르게 사용되는데, 크게 3가지로 개념, 명세, 구현의 차원들 입니다.먼저 개념 차원의 UML은 문제 도메인의 구조를 나타내며 사람이 풀고자 하는 문제 도메인 안에 있는 개념과 추상적 개념을 기술하기 위한 것입니다. 이것은 소스코드와 관계가 그렇게 깊지 않으며 오히려 사람의 자연언어와 더 관련이 있습니다. 또한 의미론적(언어의 뜻을 규정하는) 규칙에 그다지 얽매이지 않으며, 따라서 의미하는 바도 모호하거나 해석에 따라 달라질 수 있는 부분이 존재합니다.

반면, 명세와 구현 차원의 UML은 소프트웨어의 설계 혹은 완성된 소프트웨어의 구현 설명 목적 등으로 사용하며 설계를 해서 소스코드로 바꾸거나 구현 된 소스코드를 설명하려고 사용하기 때문에 소스코드와 관계가 깊습니다. 이 두 차원의 클래스 다이어그램은 제약이 많아서 반드시 일정한 규칙과 의미론을 지켜야 합니다. 또한 모호성이 거의 없도록 하고 형식도 최대한 맞춰야 합니다.

앞으로 나올 내용들은 구조 다이어그램 중 하나인 클래스 다이어그램이며 그 중에서도 개념 차원은 배제하고 소스코드와 관계가 깊은 명세, 구현 차원에 해당하는 클래스 다이어그램만으로 한정 지어 소스코드와 어떻게 연관 되는지 이해해 보도록 하겠습니다. 따라서 개념 차원의 클래스 다이어그램과는 조금 다른 부분이 있을 수 있습니다.

3. 클래스 다이어그램의 요소(Element)

Class (클래스)

클래스는 보통 3개의 compartment(구획)으로 나누어 클래스의 이름, 속성, 기능을 표기합니다. 속성과 기능은 옵션으로 생략이 가능하지만 이름은 필수로 명시해야 합니다.

[그림 3] 클래스

클래스의 세부사항은 필드와 메서드의 Access modifier(접근제한자), 필드명(메서드명), 데이터타입, parameter(매개변수), 리턴 타입 등을 나타낼 수 있습니다. 클래스의 세부사항들을 상세하게 적는 것이 유용할 때도 있지만, UML 다이어그램은 필드나 메서드를 모두 선언하는 곳이 아니기 때문에 다이어그램을 그리는 목적에 필요한 것만 사용하는 것이 좋습니다. 추가로 보통 3개의 구획(compartment)을 사용 하지만 다른 미리 정의되거나 사용자 정의 된 모델 속성(비즈니스 룰, 책임, 처리 이벤트, 발생된 예외 등)을 나타내기 위한 추가 구획도 사용할 수 있다고 합니다.

Stereo Type (스테레오 타입)

스테레오 타입이란 UML에서 제공하는 기본 요소 외에 추가적인 확장요소를 나타내는 것으로 쌍 꺾쇠와 비슷하게 생긴 길러멧(guillemet, « ») 사이에 적습니다. 이 길러멧이란 기호는 쌍 꺾쇠와는 좀 다른 것으로 폰트 크기보다 작습니다. 종이나 화이트보드에 그릴 때는 상관없지만 공식적인 문서라면 이 기호를 구분해서 사용하는 것이 좋을 것 같습니다.

[그림 4] 스테레오 타입

위의 다이어그램은 인터페이스와 유틸리티 클래스를 표현하고 있으며 필드, 메소드 밑의 밑줄은 static(정적)필드 또는 메서드를, {readOnly}는 final 키워드를 사용하는 상수를 의미합니다. 스테레오 타입으로 많이 사용되는 것은 «interface», «utility», «abstract», «enumeration» 등이 있습니다.

Abstract Class/Method (추상 클래스 / 메서드)

추상클래스란 1개 이상의 메서드가 구현체가 없고 명세만 존재하는 클래스를 말합니다.

[그림 5] 추상클래스

추상 클래스의 이름과 메서드는 italic체나, {abstract} 프로퍼티를 사용하여 표기합니다. UML 툴에서는 italic체로 표기하는 것이 많지만 종이나 칠판에 그릴 때는 힘들게 italic체로 기울여서 적는 것 보다는 {abstract} 프로퍼티로 표기하는 것이 쉽고 명확할 것 같습니다.

또한 공식적인 것은 아니지만 스테레오타입을 사용하여 추상 클래스를 표기하기도 합니다.

4. 클래스간의 관계

클래스 다이어그램의 주 목적은 클래스간의 관계를 한눈에 쉽게 보고 의존 관계를 파악하는 것에 있습니다. 그렇기 때문에 클래스 다이어그램에서 가장 중요한 것이 클래스간의 관계입니다.

[그림 6] 클래스 관계 종류

위의 그림은 클래스간의 관계들의 종류와 표기법을 나타낸 것입니다. 이 외에 다른 표기법도 있습니다만 많이 사용된다고 생각하는 것들만 나타냈습니다.

Generalization (일반화)

Generalization은 슈퍼(부모)클래스와 서브(자식)클래스간의 Inheritance(상속) 관계를 나타냅니다. 여기서 Generalization이란 서브 클래스가 주체가 되어 서브 클래스를 슈퍼 클래스로 Generalize 하는 것을 말하고 반대의 개념은 슈퍼 클래스를 서브 클래스로 Specialize(구체화) 하는 것입니다. 상속은 슈퍼 클래스의 필드 및 메서드를 사용하며 구체화 하여 필드 및 메서드를 추가 하거나 필요에 따라 메서드를 overriding(오버라이딩) 하여 재정의 합니다. 또는 슈퍼 클래스가 추상 클래스인 경우에는 인터페이스의 메서드 구현과 같이 추상 메서드를 반드시 오버라이딩 하여 구현하여야 합니다.

[그림 7] Generalization

위와 같이 표기법은 클래스 사이에 실선을 연결하고 슈퍼 클래스 쪽에 비어 있는 삼각형으로 나타내고 자바에서는 extends 키워드를 사용하여 상속을 구현합니다.

Realization (실체화)

Realization은 interface의 spec(명세, 정의)만 있는 메서드를 오버라이딩 하여 실제 기능으로 구현 하는 것을 말합니다.

[그림 8] Realization

Realization을 나타내는 표기법은 2가지가 있습니다. 첫 번째는 인터페이스를 클래스처럼 표기하고 스테레오 타입 «interface»를 추가합니다. 그리고 인터페이스와 클래스 사이의 Realize 관계는 점선과 인터페이스 쪽의 비어있는 삼각형으로 연결합니다. 두 번째는 인터페이스를 원으로 표기하고 인터페이스의 이름을 명시합니다. 그리고 인터페이스와 클래스 사이의 관계는 실선으로 연결합니다.

자바에서는 위와 같이 implements 키워드를 사용하여 인터페이스를 구현합니다.

Dependency (의존)

Dependency는 클래스 다이어그램에서 일반적으로 제일 많이 사용되는 관계로서, 어떤 클래스가 다른 클래스를 참조하는 것을 말합니다.

[그림 9] Dependency

위의 그림은 자바에서 참조하는 형태에 대해 코드를 보여주고 있습니다. 참조의 형태는 메서드 내에서 대상 클래스의 객체 생성, 객체 사용, 메서드 호출, 객체 리턴, 매개변수로 해당 객체를 받는 것 등을 말하며 해당 객체의 참조를 계속 유지하지는 않습니다.

[그림 10] Dependency Stereo Type

추가로 위와 같이 스테레오 타입으로 어떠한 목적의 Dependency인지 의미를 명확히 명시 할 수도 있는데 Dependency의 목적 또는 형태가 중요할 경우 사용할 수도 있을 것 같습니다.

Association (연관), Directed Association(방향성 있는 연관)

클래스 다이어그램에서의 Association은 보통 다른 객체의 참조를 가지는 필드를 의미합니다. 아래 클래스 다이어그램은 두 가지 형태의 Association을 나타내고 있습니다.

[그림 11] Assocication

첫 번째 다이어그램은 일반적인 Association으로 단지 실선 하나로 클래스를 연결하여 표기하고 두 번째 다이어그램은 Directed Association으로 클래스를 실선으로 연결 후 실선 끝에 화살표를 추가합니다. Association과 Directed Association의 차이는 화살표가 의미하는 navigability(방향성)인데 이것에 따라 참조 하는 쪽과 참조 당하는 쪽을 구분합니다. 두 번째 다이어그램은 User에서 Address 쪽으로 화살표가 있으므로 User가 Address를 참조하는 것을 의미합니다. Navigability가 없는 Association은 명시되지 않은 것으로 User가 Address를 참조할 수도, Address가 User를 참조할 수도, 또는 둘 다일 수도 있는 것을 의미합니다. 화살표 옆에 있는 –addresses는 roleName(역할명)을 나타내고 Address가 User 클래스에서 참조될 때 어떤 역할을 가지고 있는지를 의미합니다.

*는 Multiplicity(개수)을 나타내는데 대상 클래스의 가질 수 있는 인스턴스 개수 범위를 의미합니다. 0…1 과 같이 점으로 구분하여 앞에 값은 최소값, 뒤에 값은 최대값을 의미하는데 *은 0…*과 같은 의미로 객체가 없을 수도 있고 또는 수가 정해지지 않은 여러 개일 수도 있다는 것을 의미합니다. 이전에는 Multiplicity가 아닌 Cardinality로 불렸는데 “특정 집합 또는 다른 그룹에 있는 요소의 수”라는 Cardinality의 사전적 의미가 실제 인스턴스의 수가 아닌 가질 수 있는 범위를 지정하는 클래스 다이어그램에서의 의미에 적합하지 않다는 이유로 바뀌었습니다.

세 번째의 다이어그램은 두 번째의 다이어그램과 비슷한 의미를 가지고 있지만 다른 형태인 속성 표기법으로 나타낸 것입니다. 여기서 보는 바와 같이 roleName은 보통 클래스의 필드명이 됩니다. 속성 표기법이 두 번째 클래스 다이어그램과 조금 다른 점은 여러 개의 객체에 대한 Container(컨테이너)가 List라는 것까지 알려주고 있습니다.

그럼 두 번째와 세 번째의 다이어그램이 완전히 동일한 의미를 가지게 하려면 어떻게 해야 할까요?

[그림 12] Association Class

위와 같이 Association Class(연관클래스)를 사용하여 어떤 종류의 컨테이너 클래스가 사용되는지 까지 나타낼 수 있습니다. 하지만 사실 특이한 클래스도 아니고 자바에서 기본으로 제공되는 List를 저렇게 표기하는건 조금 귀찮은 일일 수 있을 것 같습니다. 그래서 스테레오 타입으로 표기할 수도 있습니다. 이로써 [그림11] 세 번째 다이어그램의 속성 표기법으로 표현된 것과 모든 의미가 같아졌습니다. 보통은 클래스의 속성이 기본 제공 클래스가 아니거나 중요 또는 강조하고 싶을 때 Association 관계로 나타냅니다. Association Class는 조금 다른 의미로도 사용될 수 있습니다. 예를 들어 학생과 수강과목 클래스가 Association 관계를 가지고 있는데 단순 Association 관계가 아니라 각 관계마다 해당 과목의 학점이라는 속성이 필요하다면 어떻게 나타낼 수 있을까요? 이럴 때도 Association Class를 사용하여 나타낼 수 있습니다.

[그림 13] Association Class

물론 grade라는 값을 Subject 클래스 자체의 속성으로 할 수도 있지만 Subject의 속성이라기 보다는 Student와 Subject 사이의 관계에 대한 속성이라는 관점에서 위의 다이어그램처럼 Association Class로 나타낼 수 있습니다.

[그림 14] Association Class Vs Association

또한 [그림13]의 Association Class를 풀어서 위처럼 Association 관계만으로도 나타낼 수 있습니다. [그림13]은 Student와 Subject의 관계를 나타내고 싶은데 그 관계에 대한 속성값으로 Grade가 있는 것이고 [그림14]는 단순 3개 클래스를 Association 관계로 나타낸 것처럼 의미는 조금 다를 수 있으나 구현되는 코드는 같을 것입니다.

[그림 15] Association Class Code

Aggregation (Shared Aggregation, 집합)

Aggregation은 Shared Aggregation이라고도 하며 Composition(Composite Aggregation)과 함께 Association 관계를 조금 더 특수하게 나타낸 것으로 whole(전체)와 part(부분)의 관계를 나타냅니다. Association은 집합이라는 의미를 내포하고 있지 않지만 Aggregation은 집합이라는 의미를 가지고 있습니다.

[그림 16] Aggregation

표기법은 위와 같이 whole과 part를 실선으로 연결 후 whole쪽에 비어있는 다이아몬드를 표기합니다. Part쪽에는 화살표를 명시하여도 되고 명시하지 않아도 됩니다. Aggregation의 다이아몬드가 이미 navigability의 방향을 표현하고 있기 때문입니다. 그런데 코드를 보시면 위에서 보았던 Association의 코드와 똑같습니다. Association과 Aggregation은 집합이라는 개념적인 차이는 있지만 코드에서는 이 차이를 구분하기 힘듭니다.

[그림 17] UML Aggreagtion 출처: OMG Unified Modeling Language Superstructure 2.4.1

위와 같이 UML은 집합이라는 개념 외에 명확한 Aggregation의 정의를 제공하지 않습니다. 그래서 여러 프로그래머나 분석가, 설계사가 Aggregation 관계에 대해 자기 나름의 정의를 내렸기 때문에 혼란이 생겼고 Aggregation은 사용하지 않는 것이 좋다고 합니다. 저도 이에 동의 하는 바이지만….. 아직도 논란이 되고 있는 부분이고 정확한 답을 내기는 어려울 것 같습니다.그리고 도서 “The Object Primer: Agile Model-Driven Development with UML 2.0(저자 Scott W. Ambler)”과 “UML 실전에서는 이것만 쓴다(저자 Robert C. Martin)”에 UML 2.0에서는 위의 문제 때문에 Aggregation이 제외 되었다는 말이 있습니다. 그래서 근거를 찾기 위해 이곳 저곳 찾아본 결과 처음엔 제외 되었다가 커뮤니티의 강력한 항의로 다시 들어왔다고 합니다. 실제로도 UML 1.x 버전에 비해 2.x 버전에는 Aggregation에 대한 내용이 많이 사라지긴 했지만 몇 군데 남아 있는 걸 확인했습니다.

[그림 18] Aggregation Dropped 출처: https://coderanch.com/t/154620/java-Architect-OCMJEA/certification/Association-Aggregation

Composition (Composite Aggregation, 합성)

Composition(또는 Composite Aggregation)도 Aggregation과 비슷하게 whole(전체)와 part(부분)의 집합 관계를 나타내지만 개념적으로 Aggregation보다 더 강한 집합을 의미합니다.

[그림 19] Composition

Composition의 표기법 또한 위와 같이 Aggregation과 비슷하지만 다이아몬드의 내부가 채워져 있다는 점만 다릅니다. 그럼 Composition의 개념과 코드에서는 Aggregation과 어떤 차이가 있는지 보겠습니다. Composition은 Aggregation보다 강한 집합이라고 했습니다. 여기서 강한 집합이란 part가 whole에 종속적이어서 part가 whole의 소유입니다. 반면 Aggregation은 part가 whole에 대해 독립적이어서 whole이 part를 빌려 쓰는 것과 비슷합니다. 이러한 의미 때문에 Aggregation과는 다르게 명확하게 나타나는 점이 있습니다.

첫 번째, part를 가지는 whole 인스턴스가 part 인스턴스의 전체 수명을 책임진다.

두 번째, part에 해당하는 인스턴스는 공유 될 수 없다.

첫 번째의 whole 인스턴스가 part 인스턴스의 전체 수명을 책임진다는 의미는 다음과 같습니다.

whole 인스턴스가 part 인스턴스를 생성

whole 인스턴스가 소멸되면 part 인스턴스도 함께 소멸

whole 인스턴스가 복사되면 part 인스턴스도 함께 복사

두 번째의 part에 해당하는 인스턴스는 공유 될 수 없다는 의미를 먼저 보겠습니다.

[그림 20] Shallow Copy

위의 예제는 클래스 다이어그램이 아닌 객체 다이어그램으로 [그림19]를 객체로 표현한 것입니다. 참조변수 userA가 참조하고 있는 user 객체를 clone하여 clonedUser 객체를 만들고 참조변수 userB에서 참조하고 있습니다. user객체는 제대로 복사가 됐지만 user객체 안에서 참조하고 있는 address는 clonedUser 객체도 똑같이 참조하고 있습니다. 이것을 shallow copy(얕은 복사)라고 하며 이 경우에 part에 해당하는 address 객체가 공유 된 것입니다. 또한 첫 번째 조건의 의미 중 whole 인스턴스가 복사되면 part인스턴스도 복사되어야 한다는 조건도 충족시키지 못했습니다.

[그림 21] Deep Copy Object Diagram

위의 다이어그램에서는 user 객체가 복사되어 clonedUser 객체가 생성될 때 user 객체가 참조하여 가지고 있는 address 객체 또한 같이 복사 되어 clonedUser 객체는 새로운 clonedAddress 객체를 참조하여 가지고 있습니다.

[그림 22] Deep Copy Code

Aggregation 관계와 Composition 관계를 UML 툴에서 그린 후 Code Generation을 하면 똑같은 코드가 생성됩니다. 하지만 Composition에서는 개발자가 구현해야 할 부분이 몇 가지 있습니다. 위에서 본 part에 해당하는 인스턴스가 공유되지 않게 하기 위한 Deep Copy 구현과 part를 가지는 whole 인스턴스가 part 인스턴스의 수명 전체를 책임져야 한다는 것에 따라 whole 클래스의 생성자 또는 기타 메서드 내에서 part 인스턴스를 생성해야 하고 외부에서 part 객체를 생성하지 못하도록 whole 클래스에는 part 인스턴스에 대한 setter가 있으면 안됩니다. 다른 언어에서는 생명주기와 관련된 다른 추가적인 것도 있겠지만 자바에서의 객체 소멸은 Garbage Collector가 수행하므로 part 인스턴스의 소멸은 신경쓰지 않아도 됩니다.

5. 마치며

이로써 클래스 다이어그램의 주요 요소들과 관계들이 소스코드와 어떻게 연관되는지를 살펴 봤습니다. 우선 많은 용어들에 대해 영문발음 그대로 한글로 표기하는 것들은 처음에만 영문 표기 후 한글로 표기하였고 영문 용어가 해석에 따라 달라질 수 있는 것들(예: Association->연관)은 최대한 영문 그대로 표기하였습니다.

또한 UML에서 attribute(속성), operation(기능)이라고 부르는 것들이 자바에서는 filed(필드), method(메서드)라 불리우기 때문에 의미는 비슷하지만 사용 관점에 따라 분리하여 사용한 것들도 있으며 초급 개발자로서 UML에 관련된 내용을 쓰려니 혹시 내가 잘못 알고 있는 것은 아닐까 조심스러워서 UML 스펙 문서를 많이 찾아가며 최대한 표준에 맞게 쓰려고 하였습니다.

저는 처음에 클래스 다이어그램을 공부하면서 개념적으로 들었을 때는 이해가 갈듯 말듯 하다가 코드를 보면서 아 이런 거구나 하며 그나마 조금 더 이해가 갔던 기억이 납니다. 설계를 하시는 분들이 아닌 저와 같이 이제 막 개발자의 길로 들어서신 초급 개발자 분들이 설계 다이어그램을 보며 어떤 식으로 이해를 해야 하고 어떻게 코드를 만들어야 할지 조금이라도 도움이 되었으면 합니다.

그리고… 개인적인 내용입니다만 아직 많이 모자라지만 1년동안 많은 도움을 주셨던, 특히나 UML과 설계와 관련된 많은 지식을 전해주신 제 멘토 김현오 선임께 감사하단 말씀을 제대로 못 드린 것 같아 여기서 감사의 말씀을 드리고 싶습니다..^^

감사합니다.

예제 자료

참조 도서 및 사이트

So you have finished reading the uml 화살표 topic article, if you find this article useful, please share it. Thank you very much. See more: 클래스다이어그램 화살표, UML 상속 화살표, 클래스 다이어그램 툴, 클래스 다이어그램 만들기, UML 다이어그램, UML 관계 표현, UML 예시, UML 설계

Leave a Comment