Class diagram
클래스 클래스 이름 연산 속성 2 class Transportation { private int maximumPassenger; private double speed; public void depart(); public void stop(); }
속성 – 기본 개념
속성 객체의 상태 / 정보를 표현하기 위한 수단 모니터 객체들의 상태 / 정보를 표현 직원 객체들의 상태 / 정보를 표현 4
가시성 (scope) 속성에 대한 접근 권한 가시성의 유형표기법설명 공용 (public) ‘+’ 클래스 외부에서도 접근 가능 보호 (protected) ‘#’ 하위 클래스에서도 접근 가능 패키지 (package) ‘~’ 클래스가 소속된 동일 패키지에서도 접근 가능 전용 (private) ‘-‘ 클래스 내부에서만 접근 가능 5
이름, 유형 (type) 이름 : 각 속성을 고유하게 식별하기 위한 명칭 유형 : 속성이 가질 수 있는 값의 범위를 결정 유형의 종류설명 Integer UML 2.5 표준에 정의된 기본 유형 Boolean String UnlimitedNatural Real Date java.util.Date 패키지에 정의된 유형 Color, Gender 사용자 정의 유형 6
다중성 (multiplicity), 초기값 다중성 : 동일한 이름의 속성값이 여러 개 있음을 표현 “– phoneNumber : String[2]” 는 전화번호를 2 개 가질 수 있음을 뜻함 phoneNumber[0], phoneNumber[1] 의 형태로 접근할 수 있음 초기값 : 객체 생성 시 속성에 대입되는 값 Gender.java public enum Gender { FEMALE, MALE } Person.java import java.util.Date ; class Person { private String name; private String address; private String[] phoneNumber = new String[2]; private Date birthDate; private int age = 1; private Gender gender = Gender.MALE; } 7 Person -name : String -address : String -phoneNumber : String[2] -birthDate : Date -age : int = 1 -gender : Gender = MALE
속성 표기법 표기 형태 : “ 가시성 이름 : 유형 [ 다중성 ] = 초기값 ” 필수 요소 : 가시성, 이름, 유형 8
인스턴스 범위 속성, 클래스 범위 속성 인스턴스 범위 속성 : 객체 단위로 적용되는 속성 클래스 범위 속성 : 클래스 단위로 적용되는 속성 totalWindowCount 는 클래스 범 위 속성임 9 public class Window { private static int totalWindowCount; private Color color; … } Window -leftTop : Position -rightBottom : Position -Caption : String -color : Color -totalWindowCount : int
유도 (derived) 속성 (1/2) 유도 속성 : 다른 속성에 의해 그 값이 결정되는 속성 유도 속성의 값이 다른 속성으로부터 어떻게 계산되는지 명시적으로 기술하는 것이 좋음 10
유도 (derived) 속성 (2/2) 유도 속성의 값은 같은 클래스에 속한 다른 속성들뿐만 아 니라 다른 클래스와의 관계를 통해 결정될 수도 있음 11
속성 – 기본 원칙
속성의 이름은 구체적이어야 함 작명 규칙 (1/2) 부적절한 예설명적절한 예 연료 연료유형인지 연료량인지 연비 인지 명확하지 않음 연료유형 연료량 연비 탑승인원 현재 탑승인원인지 최대 탑승인 원인지 평균 탑승인원인지 명확 하지 않음 현재 탑승인원 최대 탑승인원 평균 탑승인원 해상도 최대 해상도인지 표현 가능한 해 상도 범위인지 명확하지 않음 최대 해상도 표현가능 해상도 [0 ~ 255] 연락처 유선 전화번호인지 무선 전화번 호인지 전자우편 주소인지 명확 하지 않음 유선 전화번호 무선 전화번호 전자우편 주소 13
작명 규칙 (2/2) 속성의 이름으로 특정 프로그래밍 언어, OS, 미들웨어, 프 레임워크 등이 언급되어서는 안 됨 부적절한 이름적절한 이름설명 사용자이름 텍스트박스사용자이름 텍스트박스, 필드, 콤보박스 등은 UI 구현에 필요한 UI component 이고 이는 얼마든 지 바뀔 수 있기 때문에 이름 에 포함시키기에 부적절함 암호 필드암호 광역시이름 콤보박스광역시이름 방문할 층 번호 배열방문할 층 번호 배열은 자료구조의 한 종류 이고 자료구조는 얼마든지 바뀔 수 있기 때문에 이름에 포함시키기에 부적절함 14
응집도 (cohesion) 에 따른 클래스 분할 속성들 간의 연관성이 낮을 땐 비슷한 속성들끼리 묶어 클 래스를 분할하는 것이 바람직함 15
속성 – 실용 지침
데이터타입을 이용한 클래스 분할 유사한 속성들을 묶어 데이터타입을 정의하면 클래스를 보다 간결하고 명확하게 정의할 수 있음 17
유도 (derived) 속성 사용의 이점 유도 속성의 갱신횟수보다 조회횟수가 더 많으면 유도 속 성을 사용함으로써 성능상 이점을 얻을 수 있음 유도 속성을 사용하지 않을 때유도 속성을 사용할 때 public class Window { private Position leftTop ; private Position rightBottom ; … public int getWidth() { return rightBottom.x – leftTop.x ; } public int getHeight() { return rightBottom.y – leftTop.y ; } public class Window { private Position leftTop ; private Position rightBottom; private int width, height ; public int getWidth() { return width ; } public int getHeight() { return height ; } public void setLeftTop(Position p) { leftTop = p ; updateWidth() ; updateHeight() ; } public void setRightBottom(Position p) { rightBottom = p ; updateWidth() ; updateHeight() ; } private void updateWidth() {width = rightBottom.x–leftTop.x ;} private void updateHeight() {height = rightBottom.y–leftTop.y ;} } 18
연산 - 기본 개념
연산 객체의 행위 (behavior) 를 나타내기 위한 수단 20
연산 표기법 표기 형태 : 가시성 연산 이름 ( 매개변수 1, 매개변수 2, …) : 반환 유형 매개변수는 매개변수 이름 : 매개변수 유형으로 표기 필수 요소 : 가시성, 연산 이름, 반환 유형 21
추상 연산, 추상 클래스 추상 연산 : 연산에 대한 선언만 있고 정의는 없음 추상 클래스 : 객체를 생성할 수 없는 클래스 22 public abstract class ClosedShape { private double area = 9.0; private int length; public abstract void draw(); public double getArea() { return area; } public abstract int getLength(); }
연산 - 기본 원칙
연산의 일관성 연산은 하나의 기능을 제공해야 함 24
응집도 (cohesion) 에 따른 클래스 분할 연산 간의 연관성이 낮을 땐 관련 있는 연산끼리 묶어서 클래스를 따로 정의하는 것이 바람직함 25
연산 – 실용 지침
데이터타입을 이용한 매개변수 및 반환 유형 정의 (1/2) 연관성이 높은 데이터들을 대상으로 데이터타입을 정의 하여 연산의 매개변수나 반환 유형으로 사용할 수 있음 27
데이터타입을 이용한 매개변수 및 반환 유형 정의 (2/2) 연관성이 낮은 데이터들은 데이터타입을 정의하지 않는 것이 좋음 28
연관관계 – 기본 개념
연관관계의 표현 (1/4) 양방향 연관관계 class Professor { Assistant assistant ; public void searchMajor() { … } public void searchGrade() { … } } class Assistant { Professor professor ; public void prepareClass() { … } } 30
연관관계의 표현 (2/4) 단방향 연관관계 class Professor { private Assistant assistant ; public void searchMajor() { … } public void searchGrade() { … } } class Assistant { private Professor professor ; public void prepareClass() { … } } 31
연관관계의 표현 (3/4) 다중성 있는 연관관계 class Professor { private Collection lectures ; public void searchMajor() { … } public void searchGrade() { … } } class Lecture { private Professor professor ; public void searchProfessor() { … } public void searchNumOfStudent() { … } public void searchClassHour() { … } } 32
연관관계의 표현 (4/4) 다중 연관관계 class Professor { private Collection counselSt udents ; private Collection lectureSt udents ; public void searchMajor() { … } public void searchGrade() { … } } class Student { private Professor adviseProfessor ; private Collection lectureProf essors ; public void searchGrade() { … } public void searchSchoolYear() { … } } 33
연관관계 – 기본 원칙
연관관계와 연산의 가시성 연산의 가시성에 따라 연산을 호출할 수 있는지, 없는지 여 부가 결정됨 35 class Client{ private Supplier supplier; public void op() { supplier.publicOp(); … } … }
연관관계 표현 시 유의할 점 호출하는 연산의 개수 만큼 연관관계를 줄 필요가 없음 36
연관관계 – 실용 지침
교수 클래스조교 클래스 class Professor { private int minSize = 1 ; private int maxSize = 5 ; private Collection assistants = new ArrayList (); public void addAssistant(Assitant assistant) { assert assitants.size() < maxSize ; assistants.add(assistant); } public void removeAssistant(Assistant assistant) { assert assistants.size() > minSize ; assistants.remove(assistant) ; } class Assistant { Private Professor professor ; public void setProfessor(Profess or _professor) { professor = _professor ; } 프로그래밍 언어를 통한 다중성 (multiplicity) 표현 38 객체 레퍼런스 수에 대한 제약은 추가적인 구현이 요구됨
집합관계와 포함관계 – 기본 개념
집합 / 포함관계 한 객체가 다른 객체에 종속되어 있음을 나타냄 전체 부분 집합관계 포함관계 40
집합관계 (shared aggregation) 의 특징 집합관계에선 종속된 객체를 여러 객체들이 공유할 수 있 음 41
포함관계 (composite aggregation) 의 특징 포함관계에선 종속된 객체가 단 하나의 객체에만 소속돼 있음 42 P1 : Project P2 : Project T1 : Team T2 : Team M1: Member M2: Member
집합관계와 포함관계 – 기본 원칙
집합 / 포함관계의 비대칭성과 이행성 비대칭성 (asymmetry): 양방향 관계가 성립 안 됨 이행성 (transitivity): A 가 B 를 포함하고, B 가 C 를 포함하면 A 는 C 를 포함함 44 단락은 문자를 포함함
일반화관계 – 기본 개념
draw() erase() getLength() getArea() draw() erase() getLength() 일반화관계의 특성 및 표현 (1/9) 하위 클래스는 상위 클래스의 속성과 연산을 물려받음 46
일반화관계의 특성 및 표현 (2/9) 47 Shape 클래스 OpenShape 클래스 class Shape { public void draw() { … } public void erase() { … } public int getLength() { … } } class OpenShape extends Shape { }
일반화관계의 특성 및 표현 (3/9) 하위 클래스 고유의 정보와 기능을 제공하기 위해 속성 / 연산을 추가할 수 있음 48
일반화관계의 특성 및 표현 (4/9) ClosedShape 클래스 Polygon 클래스 class ClosedShape extends Shape { private Color fillColor ; public float getArea() ; } class Polygon extends ClosedShape { private Point[] points ; public int getNumberOfSide() }{ … } public int getInsideAngle() { … } } 49
일반화관계의 특성 및 표현 (5/9) 하위 클래스는 물려받은 연산을 재정의 (override) 할 수 있음 50
일반화관계의 특성 및 표현 (6/9) Polygon 클래스 class Polygon extends ClosedShape { private Point[] points ; public void draw() { … } public void erase() { … } public int getLength() { … } public float getArea() { … } … } 51
일반화관계의 특성 및 표현 (7/9) 추상연산 추상 클래스 52 추상 연산은 반드시 구체화 되어야 함
일반화관계의 특성 및 표현 (8/9) ClosedShape 클래스 Polygon 클래스 class ClosedShape extends Shape { private Color fillColor ; public abstract float getArea() ; } abstract class Polygon extends ClosedShape { private Point[] points ; public int getNumberOfSide() }{ … } public float getArea() { … } … } 53
일반화관계의 특성 및 표현 (9/9) 일반화관계는 다형성 (polymorphism) 을 가능케 함 54 ClosedShape cs = new Polygon(); cs.getArea(); ClosedShape 클래스의 연산 대신 자식 클래스의 연산이 호출됨 ClosedShape 클래스의 객체 대신 자식 클래스의 객체를 생성
일반화관계 – 기본 원칙
일반화관계 표현 시 유의할 점 (1/2) 상위 클래스의 속성 / 연산이 일부 하위 클래스에만 의미 있 어선 안 됨 56
일반화관계 표현 시 유의할 점 (2/2) 하위 클래스와 상위 클래스 간에 is-a 관계가 만족돼야 함 57
일반화관계 – 실용 지침
추상 클래스와 인터페이스의 차이 구체 클래스, 추상 클래스, 인터페이스의 비교 추상 클래스와 인터페이스의 비교 구체 클래스 추상 클래스 인터페이스 객체의 생성 가능불가능 용도기능의 구현기능의 명세 추상 클래스인터페이스 속성 및 구현 포함 여부 포함 가능포함 불가능 59
의존관계 – 기본 개념
연관관계와 의존관계의 차이 (1/3) 연관관계와 의존관계의 비교 연관관계의존관계 관계의 발생 형태클래스의 속성으로 정의 연산의 매개변수 유형으로 정의 연산 내부에 객체를 생성 연산 내부에서 전역 객체에 접근 관계의 지속 범위객체가 소멸될 때까지연산이 종료될 때까지 방향성양방향 가능단방향 61
연관관계와 의존관계의 차이 (2/3) 연관관계 class Class1 { private Class2 aClass2 ; public void op11() { aClass2.op2() ; } public void op12() { aClass2.op2() ; } 62
연관관계와 의존관계의 차이 (3/3) 의존관계 class Class3 { public void op31(Class4 arg) { arg.op4() ; } public void op32() { Class5 c5 = new Class5() ; c5.op5() ; } public void op33() { Class6::op6() ; } 63
의존관계와 인터페이스 의존관계를 통해 인터페이스와 인터페이스 사용자 간의 관계를 나타낼 수 있음 의존관계 : Canvas 클래스는 Idrawable 인터페이스에 의존함 인터페이스 실체화 (realization) 관계 : Face 클래스는 IDrawable 인터페이스를 실체화함 64