소프트웨어공학개론 강의 11: UML 코드매핑 최은만동국대학교컴퓨터공학과
구현작업 l 작업이후본격적으로시스템을구축하는단계 l 프로그램, 즉코드모듈을구축하는과정 2 2
StarUML 코드생성 l Tools->Java->Generate Code 3
정적모델의구현 l 설계를프로그램으로매핑 l 클래스다이어그램과패키지다이어그램이프로그램과밀접 l 추상수준에따라구현에도움이되는정도가다름 l 개념수준 도메인개념 l 명세수준 인터페이스와타입 l 구현수준 구현에종속적인사항을포함 4 4
클래스의구현 l 클래스코드의골격 l 속성 클래스안의인스턴스변수 l 오퍼레이션 클래스안의메소드 5 5
상속 l UML 표현이언어문법에 1 대 1 매칭 6 6
연관의구현 l 연관 l 두클래스에속한객체들이정보를추적할수있게하려는것 l 양방향연관 l 두클래스가같은패키지안에있어야 l 양방향은두클래스가서로상대편객체를알고있어야하므로서로를알기위한 public 메소드와 private 변수가있어야 // no need to import if in same package Schedule Student class Schedule public Schedule() //constructor private Student thestudent; class Student public Student() private Schedule theschedule; 7
연관의역할 l 역할의추가 l 각클래스가다른클래스에대하여알고있어야 l 예 ) CourseOffering 클래스는 public 메소드 CourseOffering() 가있어야하며 private 타입의 Professor 객체를가지고있어야 l Professor 클래스는 public 메소드 Professor() 와 private 타입의 CourseOffering 객체를알고있어야함 Professor instructor class Professor private CourseOffering thecourseoffering; public Professor() CourseOffering thecourseoffering class CourseOffering private Professor instructor; public CourseOffering() 8 8
다중도의구현 l 사례 l CourseOffering 클래스는 public method CourseOffering() 을가짐 l 클래스 Schedule 에는네개의 CourseOffering 객체를가질수있는배열또는리스트가있어야함 CourseOffering 0..4 primarycourses Schedule 9 class CourseOffering public CourseOffering() class Schedule private CourseOffering[] primarycourses = new CourseOffering[4]; public Schedule() public getcourseoffering() return primerycourse.element(); public addcourseoffering(courseoffering c) primarycourse.add(c); 9
집합관계의구현 l Student 클래스는 Vector 리스트타입의클래스를선언 l 집합을위한생성자는따로없음. 객체의배열로취급 l 집합관계의구현은연관관계와차이가없음 Schedule 0..* class Schedule public Schedule() private Student thestudent; import java.util.vector; 1 Student class Student public Student() private Vector theschedule; 10 10
합성관계 l 객체의존폐에대한제어가있는집합관계 l 집합개념의클래스가요소개념의객체의생성과소멸을제어 Schedule 0..* 1 Student class Schedule public Schedule() private Student thestudent; import java.util.vector; class Student public Student() private Vector theschedule = new Vector(); 이부분은집합관계와동일 11 11
추상클래스의구현 l 객체가생성되는클래스가아니라상속된클래스가구체적으로구현하도록메소드와변수의선언만있는템플릿 l <<Abstract>> 프로토타입표기 Animal abstract +talk() abstract abstract class Animal public abstract void talk(); Lion +talk() Tiger +talk() class Tiger extends Animal public Tiger() public void talk() 12 12
패키지의구현 l 패키지다이어그램 l 클래스의모임인패키지의구성과의존관계표시 l import 또는 include 사용 l 패키지선언 Package package com.abc.library; class ClassA. 13 13
동적모델링의구현 l 순서다이어그램 l 메시지의호출을표현 l 상태다이어그램 l 상태를표현하는법 l 상태의변환을메소드로구현하는법 l 액티티비다이어그램 l 제어흐름을메소드에구현하는법 14 14
순서다이어그램의구현 l 순서다이어그램 l 협력하는객체들사이의메시지교환을나타낸것 l 메시지는화살표나가는객체에서들어오는객체로메소드호출 l 메시지를받는객체는제 3 의객체에게하나이상의메시지를호출할수있음 l 순서다이어그램을코딩하는방법 l 메시지는메소드의호출로코딩. 객체의생성은생성자 (constructor) 를호출 l 메시지를받는객체의클래스안에메소드구현 l 분기구조는 if-else 문장과같은조건문으로구현 l 병렬구조는 thread 로구현 15 15
순서다이어그램의구현 ClassB ClassC o3; ClassD o4; method1( ) o3.method2(..); o4.method3(..); 메시지가호출당하는클래스안에메소드구현 16 16
사례 수강신청과정 17
구현된코드 public class CourseSection // The many-1 abstraction-occurence association private Course course; // The 1-many association to class Registration private List registationlist; // The following are present only to determine // the state // The initial state is Planned private boolean open = false; private boolean closedorcancelled = false;... public CourseSection(Course course) this.course = course; RegistrationList = new LinkedList(); 18 18
구현된코드 public void cancel() public void closeregistration() // to Cancelled state // to 'Cancelled' or 'Closed' state open = false; open = false; closedorcancelled = true; closedorcancelled = true; unregisterstudents(); if (registrationlist.size() < course.getminimum()) public void openregistration() unregisterstudents(); if(!closedorcancelled) // to Cancelled state // must be in Planned state open = true; // to 'OpenNotEnoughStudents' state 19 19
구현된코드 public void requesttoregister(student student) if (open) // must be in one of the two 'Open' states // The interaction specified in the sequence diagram Course prereq = course.getprerequisite(); if (student.haspassedcourse(prereq)) // Indirectly calls addtoregistrationlist new Registration(this, student); // Check for automatic transition to 'Closed' state if (registrationlist.size() >= course.getmaximum()) // to Closed state open = false; closedorcancelled = true; 20 20
구현된코드 // Activity associated with Cancelled state. private void unregisterstudents() Iterator it = registrationlist.iterator(); while (it.hasnext()) Registration r = (Registration)it.next(); r.unregisterstudent(); it.remove(); // Called within this package only, by the // constructor of Registration void addtoregistrationlist( Registration newregistration) registrationlist.add(newregistration); 21 21
상태다이어그램의구현 l Inactive 객체의상태다이어그램을구현하는방법 l 상태다이어그램을클래스로매핑 l 상태정보를저장하기위한속성추가 l 이벤트는메소드로상태변화나이벤트의액션은메소드안에탑재 22 22
상태다이어그램의구현 l 모든상태는상태를나타내는속성의값 l 상태변화는클래스의메소드 l 가드는메소드안의조건체크 è public void event_n(.) switch (state) case state_k: if (guard_condition_w) state = state_m; perform actions of the transition; break; case state_v: 23 23
내장된상태다이어그램의구현 l 순차서브상태를가진복합상태 (composite state) l 서브상태를구현하기위한내장클래스생성 l 부모상태머신에서내부상태다이어그램의상태변화를제어하기위한메소드 ( 내부상태클래스안의 ) 호출 l 다른구현방법은복합상태를제거하기위하여내장상태다이어그램을펼쳐서구현 l 병렬서브상태를가진복합상태 l 각서브상태를구현하기위한내장클래스생성 l 내장상태머신의구현과유사 l 모든병렬서브상태가종료되면복합상태를빠져나오도록코딩 24 24
사례 자판기제어 l 자판기제어객체의상태변화 l 내장상태 (dispense soft drink) 를가진복합객체 25 25
자판기제어객체 l 상태다이어그램을하나의클래스로구현 l 상태정보를저장하는 _state 속성추가 class VendingMachineControl int _state; float _amount, _price; static final int WaitingCoin = 1; static final int WaitingSelection = 2; static final int DispensingSoftDrink = 3; static final int DispensingChange = 4; static final int EjectingCoins = 5; 26 26
상태초기화 l 생성자안에서상태변수및기타변수초기화 public VendingMachineControl(float pric e) _amount = 0; _state = WaitingCoin; _price = price; 27 27
이벤트는메소드로 l 상태천이와이벤트의액션은메소드안에구현 public void insertedcoin(float coinvalue) if (state == WaitingCoin) amount += coinvalue; if (amount >= price) // fire transition state = WaitingSelection; show available soft drinks; // insertedcoin 28 28
서브상태의구현 l 서브상태는별도의클래스로정의 class DispenseControl int _state; static final int DispensingSoftDrink = 1; static final int DispensingChange = 2; static final int Complete = 3; public dispensecontrol() _state = DispensingSoftDrink; 29 강좌 8: 동적다이어그램의코딩 29 29
서브상태의구현 l 서브상태안의상태변화는서브상태를나타내는클래스의메소드로 public boolean dispensedsoftdrink() if (_state == DispensingSoftDrink) _state = DispensingChange; dispense change; return false; 30 30
서브상태의구현 l 서브상태안의상태변화는서브상태를나타내는클래스의메소드로 public boolean dispensedchange() if (_state == DispensingChange) _state = Complete; return true; return false; 31 31
서브상태의초기화 l 서브상태를나타내는클래스정의 l 서브상태객체생성및초기화 class VendingMachineControl..declaration of state attribute, constants, other attributes; declaration of inner class dispensecontrol;..public VendingMachineControl(float price) _amount = 0; _state = WaitingCoin; _price = price; _substate = new DispenseControl(); 32 32
서브상태의구현 l 서브상태안의상태천이는서브상태는나타내는객체의메소드호출 public void dispensedsoftdrink() // VendingMachineControl if (_state == Dispensing) boolean iscomplete = _substate.dispensedsoftdrink(); 33 33
메인과서브상태의연결 l 서브상태의종료조건체크후메인상태로전환 // VendingMachineControl public boolean dispensedchange() if (_state == Dispensing) boolean iscomplete = _substate.dispensedchange(); if (iscomplete) amount = 0; _state = WaitingCoin; 34 34
상태패턴의적용 VendingMac hine state variable control(state) transit() StateOfMachine handle() transit() WaitingCoin Selection Dispensing Client vc.control(state) handle() transit() handle() transit() handle() transit() 35
액티비티다이어그램의구현 l 액티비티나프로시저안에서수행되어야할액션들의순서를나타냄 l 제어객체나서브시스템의알고리즘이나제어흐름을나타냄 l 프로그램의위치, 즉프로그램의제어문, 반복문으로액티비티다이어그램의제어흐름을구현 l 액티비티다이어그램을코딩하는일반적인규칙 l 액션상태는메소드호출이나일반계산문장으로구현 l 제어노드는 if-then-else 문장으로구현 l 병렬노드는스레드로구현 l 반복구조는 while 루프로구현 36 36
액티비티다이어그램의구현 while (true) amount = 0.0; while (amount < price) wait for a coin; add coin value to amount; show all available soft drink; while (selection is not done) wait for selection from user; if selection is eject coins dispense coins; set selection to done ; else if selection is a valid soft drink dispense change & soft drink concurrently; set selection to done 37 37
구현단계의 UML 다이어그램 l 컴포넌트다이어그램 l 원시코드의단위가되는실행컴포넌트사이의관계 l 컴포넌트의인터페이스 38 38
배치다이어그램 l 배치다이어그램 l 런타임처리요소의형상과소프트웨어컴포넌트, 결과물, 프로세스가어디에위치하는지를나타냄 l 노드와커뮤니케이션경로를나타냄 39 39
Questions?