550 likes | 1.33k Views
소프트웨어 공학 Lecture #6: 객체지향 설계. 안 병 익 biahn99@gmail.com 강의 블로그 Mobilecom.tistory.com. 학습 목표. 객체지향 분석과 설계 객체지향 개념 UML 2.0 다이어그램 정적 모델링 동적 모델링 디자인 패턴. 객체지향 기술. 절차적인 방법은 조그만 변화에도 영향이 큼 함수와 자료를 함께 클래스로 묶음으로 여러 가지 장점을 얻을 수 있음 장점 추상화 , 정보은닉 등 설계 원리에 충실 복잡함을 잘 다룰 수 있음 특징
E N D
소프트웨어 공학Lecture #6: 객체지향 설계 안 병 익 biahn99@gmail.com 강의 블로그Mobilecom.tistory.com
학습 목표 객체지향 분석과 설계 객체지향 개념 UML 2.0 다이어그램 정적 모델링 동적 모델링 디자인 패턴
객체지향 기술 • 절차적인 방법은 조그만 변화에도 영향이 큼 • 함수와자료를 함께 클래스로 묶음으로 여러 가지 장점을 얻을 수 있음 • 장점 • 추상화, 정보은닉등 설계 원리에 충실 • 복잡함을 잘 다룰 수 있음 • 특징 • 유사성을 이용하는 방법을 제공 • 뚜렷하게 구별되는 단위로 분할 • 코드 재사용에 의하여 생산성을 높임 • 빠른 속도로 적용, 산업계 표준화
6.1 객체지향 분석과 설계 • 명확히 나누기 어려움 • 공통의 개념을 사용 • 반복적인 싸이클로 완성 • 분석은 문제 영역, 설계는 솔루션 영역을 다룸
객체지향 모델 여러 가지 관점에서 시스템을 모델링 객체지향에서는 크게 세 가지 관점의 모델을 작성
객체지향 분석 설계 과정 뚜렷한 표준 프로세스는 없음 사용사례는 맨 처음, 최종 목표는 클래스 다이어그램
프로그램= 자료구조 + 함수 프로그램 = 객 체 + 객 체 프로그램= 자료구조 + 함수 자 료 함 수 함 수 함 수 함 수 자료 자료 자료 자료 함수1 함수2 함수3 6.2 객체지향 개념 • 재래식 방법 • 기능중심, 변경의 파급효과 큼 • 객체 지향 방법 • 자료와 관련 함수의 결합
객 체 • 객체의 정의 • 소프트웨어 모듈(객체) = 자료구조 + 함수 • 객체는 상태(state), 능력(behavior), 정체성(identity)을 가진다. • 상태 • 능력 : 연산(operation)을 수행 할 수 있는 능력 • 정체성 : 구별 가능성 • 객체 인스턴스(instance) = 객체 • 비슷한 객체의 구조와 행동은 공통 클래스로 선언
클래스(Class) • 클래스(class) vs 인스턴스 (instance) • 클래스 : 객체의 타입(object type) • 인스턴스 :클래스에 속하는 개개의 객체 • 클래스의 속성(attribute) • 예 : 직원 클래스 • 속성 : 이름, 직위, 월급, 전화 번호 등 • 함수 : 진급, 월급 인상, 전화 변경 등 • 클래스는 객체들이 갖는 속성과 적용 연산을 정의하고 있는 틀(templet) • Employee Hong_kildong(); • Employee* Hone_kildong = new Emplyoee(); 직원클래스 홍길동 객체
캡슐화(Encapsulation) • 캡슐화의 정의 • 관련된 항목을 모아서 갭슐을 씌움 • 예> 학사 관리 시스템 • 데이터 : 학번, 이름, 주소 캡슐화 • 함수 : 평점 계산, 주소 변경, 수강 신청 캡슐화 • 추상화의 수단 • 세부사항은 차후에 생각 • 정보은닉(information hiding) • 외부의 직접적 접근 불가, 일종의 블랙박스 • 구현에 따라 선택 가능 • 문법 : public, private, protected
객체 사이의 관계 Publisher Book 1 * • 객체는 일반적으로 상호작용하여 동작 • 객체에 있는 서비스를 호출하면 두 객체는 관계가 맺어져야 함 • 상호작용할 필요가 있는지 찾아내는 작업이 필요 • 연관 • 서로 상대의 존재를 알 수 있도록 관련이 맺어진 것 • 예) 책과 출판사 • 서로 알게하고 접근 가능하게 하는 방법은 여러 가지가 있음 • 집합 관계 • 전체 개념과 부분 개념 사이의 관계 • 격납의 의미 • 예) 디스크 트랙 섹터
인사대상 학 생 교 수 직 원 학부생 대학원생 상속(inheritance) • 상속의 의미 • 상위 클래스의 속성과 연산을 물려 받음 • 슈퍼클래스(superclass), 서브 클래스(subclass) • 예>직원 : 슈퍼클래스 , 관리자 : 서브클래스 • 복수상속 (multiple inheritance) • 두개 이상의 수퍼클래스에서 상속 받음
다형성(polymorphism) • 다형성의 정의 • 여러 형태를 가지고 있다 (=여러 형태를 받아들일 수 있다) • 같은 이름의 메시지를 다른 객체 or 서브클래스에서 호출 • 예> getarea() 를 도형의 모양이 달라도 호출 • 메소드:특정한 클래스를 위하여 오퍼레이션을 구현 • 하나 이상의 메소드를 가진 오퍼레이션 • 매개변수나 객체가 속한 클래스의 이름으로 구분
다형성(polymorphism) • 현재 코드를 변경하지 않고 새로운 클래스를 쉽게 추가할 수 있음 다형성의 예
6.3 UML이란? • 객체지향 소프트웨어를 모델링 하는 표준 그래픽 언어 • 시스템의 여러 측면을 그림으로 모델링 • 하드웨어의 회로도 같은 의미 • 역사 • 1980년대 말부터 1990년대 초에 객체지향으로 모델링 하는 과정과 모델링 언어 출현 • 설계와 표현 방법의 급증으로 혼란을 초래 • Rumbaugh와 Booch가 1994년 두 가지 방법을 합병하기로 함 • Rational Software 라는 회사 설립 • 1995년 Jacobson이 팀에 합류 • 사용 사례를 제안 • 1997년 Object Management Group(OMG)이 UML 표준화 추진
UML의 배경과 역사 • Shlaer와 Mellor가 제안한 반복적 설계 방법 • Coad와 Yourdon이 제안한 프로토타입 중심 방법 • Worfs-Brock 등 폴랜드의 Smalltalk 그룹이 제안한 의무 중심 설계 및 CRC(Class-Responsibility-Collaboration) 카드 방법 • Rational Software의 Booch가 제안한 Ada 설계 방법 • GE 연구소의 Rumbaugh가 중심이 되어 제안한 OMT • Odell과 Martin의 정보공학을 기초로 한 방법 • Ericsson에서 일한 Jacobson의 use case 개념을 소개한 방법
6.4 정적 모델링 • 정적 모델 • 시간의 개념이 개입되지 않은 모델 • 클래스 다이어그램이 대표적 • 클래스 다이어그램 • 객체, 클래스, 속성, 오퍼레이션, 연관 등을 표현
클래스, 속성, 오퍼레이션의 표현 • 박스 위에 클래스 이름 • 추상 클래스는 이탤릭체 • 인터페이스 클래스는 <<interface>> 추가 • 속성 • 객체가 가지는 모든 필드를 포함 • 오퍼레이션/메소드 • 아주 흔한 메소드(get/set)는 생략 • 상속된 메소드도 포함할 필요 없음
클래스 사이의 관계 • 연관(association): • 객체 사이에 관련 • 예) Customer 객체가 Rental 객체에 대여 정보 문의 • 집합(aggregation): 어떤 클래스가 다른 클래스의 모임으로 구성 • 합성(composition): 포함된 클래스가 컨테이너 클래스가 없이는 존재할 수 없는 집합관계의 변형 • 일반화(generalization): 상속(isa) 관계 • 클래스 사이의 상속 • 인터페이스 구현
연관 관계 • 연관(association): • 어떤 클래스의 인스턴스가 작업을 수행하기 위하여 다른 클래스를 알아야 하는 함 • 다중도(multiplicity) • * 0, 1, or more • 1 정확히 1개 • 2..4 2개 내지 4개 • 3.. * 3개 이상 • 이름 –객체들의 관계 이름 • 방향성(navigability) –질의의 방향, 객체 사이의 선으로 표시하며 양쪽 방향인 경우는 화살표시 없음
연관 관계의 다중도 • 1 대 1 • 학생 1명이 학생증(id card) 한 개만을 가진다. • 1 대 다 • 학생 1명이 여러 클래스를 수강할 수 있다.
집합과 합성 • 영화관이 없어지면 • 매표소도 없어짐 합성 • 그러나 영화는 아직 존재 집합
일반화 관계 • 일반화(상속) • 부모를 향한 화살표로 표시되는 하향 계층 관계 • 선/화살표는 부모 클래스의 종류에 따라 다름 • 클래스: 실선/검은 헤드 화살표 • 추상 클래스: 실선/흰 헤드 화살표 • 인터페이스: 점선/흰 헤드 화살표
클래스 찾기 • 정적 모델링 • 사용사례를 작성하여 도메인 분석이 어느 정도 된 후 객체를 찾고 관계를 정의하는 작업 • 클래스가 될 수 있는 요소들 - 구조 - 외부 시스템 - 디바이스 - 역할 - 운용절차 - 장소 - 조직 - 완성된 시스템에 의하여 조작되어야 할 정보 • 클래스 후보의 세가지 유형 • 엔티티 클래스 • 경계 클래스 • 제어 클래스
엔티티 클래스 • 엔티티 클래스 • 시스템에서 계속 추적해야 할 자료가 들어 있는 클래스 • 엔티티 클래스를 발견하는 휴리스틱 • 사용사례를 이해하기 위하여 사용자와 개발자가 명확히 규정된 용어 • 사용사례에서 반복되어 나오는 용어 • 시스템이 계속 추적하여야 하는 실세계의 엔티티 • 자료저장소 또는 단말 • 자주 사용하는 응용 도메인의 용어
경계 클래스 • 시스템 외부의 액터와 상호 작용하는 클래스로 사용자 인터페이스를 제어하는 역할 • 액터와 연결된 시스템의 인터페이스 표현 • 사용자 인터페이스를 개괄적으로 모형화
제어 클래스 • 경계 클래스와 엔티티 클래스 사이에 중간 역할 • 사용 사례의 초기에 생성되고 끝까지 존재 • 경계 클래스로부터 정보를 받아 엔티티 클래스에 전달 • 예) 양식의 순서, undo, 히스토리 저장 큐 등 • 자료를 다른 클래스로부터 받아 처리하는 것이 주임무인 클래스
연관 관계 • 두 개 이상의 클래스 사이에 어떤 관계가 있음을 표현 • 연관관계의 속성 • 이름 : 두 클래스 사이의 연관관계 표현. 연관관계의 이름은 생략될 수도 있으며 유일한 이름을 붙일 필요 없음 • 역할 : 연관관계의 양쪽 끝에 있는 클래스의 기능 표현 • 다중도 : 연관관계를 구성하는 인스턴스의 개수 • 연관관계는 상태를 나타내는 동사나 동사구로 표현 • By Abbott 휴리스틱
연관 관계 1 Rent * Customer Video Tape Rental Customer와 VideoTape 클래스 사이의 연관관계 1 display * RentUI Video Tape RentUI와 VideoTape 클래스 사이의 연관관계
속 성 • 개별 객체들이 가지는 특성 • 속성의 요소 • 이름 : 객체 안에서 구별할 수 있는 속성의 이름 • 간단한 설명 : 구현하는 프로그래머를 위하여 간단히 설명 첨가 • 속성값의 타입 : 예를 들어 Name 속성은 스트링. 또한 Status는 열거형으로 rentable, rented, returned라는 값을 가질수 있다. • 소유격에 따라 나오는 구나 형용사절은 속성이 가능성 높음 • 엔티티 객체의 경우, 시스템에 의하여 저장될 필요가 있는 것들은 모두 속성임.
6.5 동적 모델링 • 클래스들의 상호작용이나 클래스의 상태 변화 등 시스템 내부의 동작 • 동적 모델링의 세가지 다이어그램 • 인터랙션 다이어그램 • 상태 다이어그램 • 액티비티 다이어그램
순서 다이어그램 • 객체 사이의 동작을 분산시키고 오퍼레이션을 찾는데 사용 • 단일 사용사례에 대한 시스템의 동작 표현 :RentUI :Rental :Customer :VideoTape :TitleI :Clerk 1.RentVideo() 1.Create() 3.getCustomerDetail() return() 4. 고객정보 고객확인 4.바코드스캔 4.getVideoTapeDetails() 4.getTitle return() return() display() 5.getTotal() 순서 다이어그램(비디오 대여 사용사례)
상호작용 다이어그램 • 객체 간의 메시지 호출은 반드시 호출한 객체가 속하는 클래스 안에 메소드로 구현되어야 함 * Person 1..* Company employee employer +setCompensation(s: Salary) +assign(d: Department) … Assign(d: Department) P:Person :Company 메시지 호출과 오퍼레이션의 관계
상태 다이어그램 • 객체가 가질 수 있는 가능한 상태 표현 • 많은 속성값과 메시지를 가진 다이나믹한 작용을 하는 객체에게만 의미가 있음 • 시작노드를 으로 종료 노드를 표시 • 둥근 사각형은 상태를 표현 • 조건은 화살표 위에 괄호 안에 기술, 화살표는 상태의 전환 의미
상태 다이어그램 • 상태 다이어그램을 모델링하기에 적합한 속성의 조건 • 속성의 값으로 가질 수 있는 종류가 적어야 한다. • 속성의 값에 따라 허용되는 오퍼레이션이 제한되어야 한다. Athorizing [age>18] [age<=18] 그림 9.13 상태 다이어그램의 예 Athorizing Athorizing Athorizing
액티비티 다이어그램 • 시스템의 동적이 부분을 모델링하는 목적으로 사용 • 액티비티 사이의 제어흐름을 보여 주는 일종의 흐름도 • 액티비티 다이어그램의 사용 • 시스템의 수준에서 시스템과 상호작용하는 각 액터의 관점에서 모델링 • 복잡한 오퍼레이션의 수행흐름을 표현
6.6 디자인 패턴 • 프로그램 개발에 자주 등장하는 문제를 기술하고 같은 작업을 반복하여 설계하지 않고 여러 번 반복하여 사용할 수 있는 문제에 대한 솔루션을 기술한 것 • 패턴 • 여러 가지 상환에 적용될 수 있는 템플릿과 같은 것 • 문제에 대한 설계를 추상적으로 표현한 것 • 문제를 해결하려는 요소들을 일반화하여 잘 정리한 것 • 커스텀화된 객체나 클래스의 연결을 나타낸 것 • 패턴의 구성 요소 • 패턴의 이름과 구분 : 패턴을 부를 때 사용하는 이름과 패턴의 유형 • 문제 및 배경 : 패턴이 사용되는 분야 또는 배경, 해결하는 문제를 의미 • 솔루션 : 패턴을 이루는 요소들, 관계, 협동 과정 • 사례 : 간단한 적용 사례 • 결과 : 패턴을 사용하면 얻게되는 이점이나 영향 • 샘플 코드 : 패턴이 적용된 원시코드
Factory 메소드 패턴 • 목적 • 객체를 생성하기 위한 인터페이스를 정의하기 위하여 • 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스에서 이루어지도록 책임을 미루기 위하여 • 위임(delegation)
팩토리 메소드 패턴 • 사용 사례 class Hyundai extends Automobile { . . . Automobile createAutomobile() { return new Hyundai(); } ... }
Rectangle Circle Group Line 컴포지트 패턴 • 목적 • 객체를 집합을 다루기 위하여 • 객체들의 집합이 있고 또 다시 객체들이 집합을 가지게 되는 구조를 처리 할 때 • 사례 전체 그림개체들을 하나의 group으로 간주 Group Rectangle Circle Line Line Circle Line Line Line Group Line Line Line Line Circle Line Part-Whole 구조
어뎁터 패턴 • 목적 • 이미 개발된 클래스(레거시 시스템이 될 수 있음)의 인터페이스를 다른 클래스의 요구에 맞게 인터페이스를 변환해주기 위하여 • 서로 호환성이 없는 인터페이스들끼리 같이 작동할 수 있게 도와주는 변환기 • 적용 • 이미 만들어져 있는 클래스를 사용하고 싶지만 인터페이스가 원하는 방식과 일치하지 않을 때
어뎁터 패턴 • 상속을 이용한 방법 • 위임을 이용한 방법
반복자 패턴 • 목적 • 유사한 객체들의 집단(예를 들면 리스트 등)을 다루기 위하여 • 시스템 속에 존재하는 여러 객체들의 집단을 모두 동일한 인터페이스를 이용하여 접근할 수 있도록 만들어 주기 위하여 • 패턴 모형
Iterator LinkedList Get(int i) Add(Element *) Remove(Element *) … LinkedListIterator First() Next() CurrentItem() IsDone() BalancedTreeIterator First() Next() CurrentItem() IsDone() BalancedTree Get(Element *root, int i) AddNode(Element *, Element*) RemoveNode(Element *) … 반복자 패턴의 사례 자료구조 검색을 위한 Iterator 객체 생성 // Client Code Iterator *iter = ds->CreateIterator(); iter->First(); Element *elm = iter->CurrentItem(); while ( elm ) { total += elm->GetValue(); iter->Next(); elm = iter->CurrentItem(); }
Observer 패턴 • 1대 다의 객체 의존관계를 정의한 것 • 한 객체가 상태를 변화시켰을 때 의존관계에 있는 다른 객체들에게 자동적으로 통지하고 변화시킴. 일명 publish-subscribe패턴