-
23. UML개발자 수업/Java 2021. 10. 18. 18:56
1. 객체지향 분석
1) 무엇을 만들 것인가를 추상화하는 과정
2) 요구사항으로부터 문제를 만들어가는 과정
2. 분석 vs 설계
1) 분석은 발견하는 것이고 설계는 발명하는 것임
2) 분석은 문제를 만들어가는 것이고 설계는 해답을 만들어가는 것임
3. 모델링(코드를 만들어내기 위한)
1) 주어진 서술에서 추상적인 모델을 정의하고 최종적으로 코드를 만들어 내기 위한 장치
2) 우리가 만들 소프트웨어는 어떠한 모습을 지니게 되는가
3) 완성된 소프트웨어가 어떻게 작동하게 될 것인가
4) 어떠한 과정을 통해서 소프트웨어를 개발할 것인가
--> 일종의 청사진이 필요함(UML : Unified Modeling Language)
4. 모델링을 하는 이유
1) 프로그램 개발을 좀 더 쉽게 이해하기 위해
2) 개발하거나 기존에 있는 시스템을 눈에 보이게 하기 위함
3) 모델 자체가 훌륭한 문서가 될 수 있음
4) 시스템의 구조와 행동을 명확하게 결정하기 위함
5) 소프트웨어를 개발하기 위한 뼈대를 제공하기 위함
5. UML 정의
1) 그래픽 표기법의 집합
2) 단일 메타모델을 기초로 함
3) 소프트웨어 시스템을 표현하고 설계할 수 있도록 도움
4) 객체지향 방식의 형태를 지원
6. UML 다이어그램 종류
1) Structure Diagram
- Class Diagram
2) Behavior Diagram
- Use Case Diagram
- Interaction Diagram
- Sequence Diagram
7. UML을 위한 다이어그램 요소
1) ClassAbstract Class는 기울임체로 표시
Class와 동일
메서드 생략 가능
필드 여러개 표시 가능
2) 정적(static) 속성과 메서드
밑줄 그으면 static
3) 파라미터화(parameterized) 클래스
8. Class Diagram
1) 소프트웨어 기본 구성 단위인 클래스와 그들 간의 관계 정의
2) 정적인 관점에서 클래스 구조 표현
3) 기본적 데이터 모델링 수행(분석단계)
4) 객체지향 언어의 코딩을 위한 설계 사양 제공(설계단계)
5) 분석에서 설계까지 일관된 소프트웨어 시스템 분석, 설계 도구
6) 객체 지향 프로그래밍에서 여러 클래스 상호 간의 협력 관계를 나타내는 diagram
7) 클래스 간의 관계를 설계할 때 유용함
9. UML을 위한 다이어그램 요소2
1) Packege
2) Interface<<Interface>> 기울임체
- 상수
- 추상 메서드
10. UML을 위한 다이어그램 요소3
1) Relationship
- 일반화 관계 (generalization)
- 객체지향에서 상속을 표현할 때
- 일반적인 클래스(상위 클래스)를 보다 구체적인 클래스(하위 클래스)가 상속함
- 실체화 관계 (realization)
- 기능이 선언된 인터페이스를 구현하는 클래스는 선언된 기능을 구현할 책임이 있음
- 여러 클래스가 하나의 인터페이스를 구현함으로써 다형성을 제공함- 강한 관계
- 약한 관계
11. 클래스 간의 관계
1) 관계
- 객체 간의 연결(링크)들을 클래스 간 관계로 추상화한 것
- 클래스들 간의 구조 혹은 참조 관계 표현
2) 연관관계(Association)
- 클래스 상호 간에 서로 연관되어 있음을 나타냄
- 단방향 연관관계의 경우는 화살표(->)로 표시함
- 양방향 연관관계는 직선(-)으로 표시함
- 클래스 간의 연관된 개체의 수를 표현해야 할 경우에는 선의 끝 쪽에 다중성을 나타냄
다수 사용
사용 범위
5부터 여러개
양방향 관계
- 참조하는 클래스는 해당 타입의 필드를 가지게 됨(사용한다)
- 얼마나 많은 수가 참조되는지 나타낼 수 있음(다중성, multiplicity)
3) 집합, 집약관계(Aggregation)
- 클래스 간의 포함관계를 나타냄
- 클래스 다이어그램에 빈 마름모로 표시
- Weak Aggregation
- "갖는다. 하지만 생성의 의무가 없다"라고 해석
- 전체와 부분의 관계를 명시적으로 나타내고 싶을 때 사용함
- 공유하는 리소스가 해당됨
- 전체 객체와 부분 객체의 라이프 타임이 독립적임
-> 전체 객체가 사라져도 포함된 객체는 사라지지 않음
4) 합성 관계(Composition)
- 클래스 다이어그램에 채워진 마름모로 표시
- 전체 객체의 라이프 타임에 부분 객체가 종속됨
-> 전체 객체가 사라지면 부분 객체도 사라짐
- 주로 멤버 변수로 선언하여 사용
- Strong Aggregation
- "갖는다. 그리고 생성 파괴 의무가 있다"라고 해석
- 참조하는 클래스는 참조 당하는 클래스 타입의 객체를 가짐
5) 의존 관게(Dependency)
- 연관 관계보다는 짧은 life time
- 프로그램 내에서는 참조 변수가 매개변수나 지역변수로 구현
- 한 쪽의 변화가 다른 쪽에 영향을 줄 수 있음
- 한 쪽 객체가 실행 도중 다른 쪽의 실행을 요청하는 경우
- 클래스와 클래스, 패키지와 패키지, 컴포넌트와 컴포넌트에도 사용
*문제*
/* * - Player라는 클래스가 있고 PlayerLevel 속성을 가짐 * - 각 GameLevel 단계마다 run(), jump(), turn() 세 가지 기능이 업그레이드 됨 * - 초보자(BeginnerLevel) 레벨 : "천천히 달립니다. jump 못합니다. turn 못해요." run()만 가능 * - 중급자(IntermediateLevel) 레벨 : "빨리 달립니다. 높이 jump 합니다. turn 못해요." run()과 jump() 가능 * - 고급자(AdvancedLevel) 레벨 : "엄청 빠르게 달립니다. 아주 높이 jump합니다. 아주 높이 jump합니다. 아주 높이 jump합니다. turn 합니다." run(), jump(), turn() 가능 * * - Player는 한 번에 하나의 레벨 상태만 가질 수 있음 * - Player가 Player()중에 레벨에 있는 go(int count)라는 메서드를 호출하면 run()하고 count만큼 jump()하고 turn() 메서드를 호출 합니다. * - 클래스 다이어그램을 참고하여 각 레벨에서 go()가 호출될 때 아래 예시처럼 출력되도록 구현하세요. * * ***********초급자 레벨입니다.*********** * 천천히 달립니다. * jump 못합니다. * turn 못해요. * ***********중급자 레벨입니다.*********** * 빨리 달립니다. * 높이 jump 합니다. 높이 jump 합니다. * turn 못해요. * ***********고급자 레벨입니다.*********** * 엄청 빠르게 달립니다. * 아주 높이 jump합니다. * 아주 높이 jump합니다. * 아주 높이 jump합니다. * turn 합니다. */ public abstract class PlayerLevel { public abstract void showLevelMessage(); public abstract void run(); public abstract void jump(); public abstract void turn(); public final void go(int count) { run(); for(int i=0; i<count; i++) { jump(); } turn(); } }
public class Player { private PlayerLevel level; public Player() { level = new BeginnerLevel(); level.showLevelMessage(); } public void upgreadeLevel(PlayerLevel level) { this.level = level; level.showLevelMessage(); } public void play(int count) { level.go(count); } }
// 초급자 public class BeginnerLevel extends PlayerLevel { @Override public void showLevelMessage() { System.out.println("***********초급자 레벨입니다.***********"); } @Override public void run() { System.out.println("천천히 달립니다. "); } @Override public void jump() { System.out.println("jump 못합니다. "); } @Override public void turn() { System.out.println("turn 못해요."); } }
// 중급자 public class IntermediateLevel extends PlayerLevel { @Override public void showLevelMessage() { System.out.println("***********중급자 레벨입니다.***********"); } @Override public void run() { System.out.println("빨리 달립니다. "); } @Override public void jump() { System.out.println("높이 jump 합니다."); } @Override public void turn() { System.out.println("turn 못해요."); } }
// 고급자 public class AdvancedLevel extends PlayerLevel { @Override public void showLevelMessage() { System.out.println("***********고급자 레벨입니다.***********"); } @Override public void run() { System.out.println("엄청 빠르게 달립니다. "); } @Override public void jump() { System.out.println("아주 높이 jump합니다."); } @Override public void turn() { System.out.println("turn 합니다."); } }
public class PlayerLevelTest { public static void main(String[] args) { Player player = new Player(); player.play(1); IntermediateLevel iLevel = new IntermediateLevel(); player.upgreadeLevel(iLevel); player.play(2); AdvancedLevel aLevel = new AdvancedLevel(); player.upgreadeLevel(aLevel); player.play(3); } }
12. Use Case Diagram
1) 사용자가 하는 행동을 나타냄
2) 시스템과 사용자 간의 상호작용
3) 사용자 관점에서 논리적인 시스템의 기능 정의
4) 개발자와 사용자, 이해관계자들 간의 이해 도모
5) 시스템 전체 개발범위 결정
6) 시스템 분석, 설계 기준
13. Sequence Diagram
- 객체들 간의 협력 과정을 동적으로 정의
- 객체 간 동적 상호작용을 시간적 개념으로 파악하기 위함
- 클래스 다이어그램과 병행되며 상호 간 일관성 요구됨'개발자 수업 > Java' 카테고리의 다른 글
25. 람다식 (0) 2021.10.19 24. 내부클래스 (0) 2021.10.19 22. Review (0) 2021.10.18 21. 컬렉션 프레임워크 (0) 2021.10.14 20. Generic 프로그래밍 (0) 2021.10.14