PPT문서ch06_아키텍처 설계와 클래스 설계(2021).ppt

닫기

background image

[강의교안 이용 안내

]

•본 강의교안의 저작권은 한빛아카데미㈜에 있습니다. 

•이 자료를 무단으로 전제하거나 배포할 경우 저작권법 136조에 의거하여 처벌을 받을 수 있습니다.


background image

Chapter 06 

아키텍처 설계와 클래스 설계


background image

01 아키텍처 설계

02 클래스 간의 관계 

03 클래스 설계 원칙


background image

• 아키텍처의 품질 속성을 살펴본다. 

• 아키텍처 스타일의 종류를 알아본다. 

• 클래스 간의 관계를 알아본다. 

• 클래스 설계 원칙의 종류를 알아본다.


background image

01. 아키텍처 설계

아키텍처 설계

• 아키텍처

• 건물의 뼈대뿐 아니라 특성을 결정짓는 기본 구조를 일컫는 말

• 아키텍처는 모든 기술 분야에 적용할 수 있고 종류도 다양함


background image

01. 아키텍처 설계

아키텍처 설계

아키텍처의 필요성
• 복합성의 문제

• 대형 프로젝트는 전체 시스템의 구조를 생각하며 균형과 조화를 이루도록 설계

• 대형 프로젝트가 복합성의 문제를 해결하는 방법

• 개발할 소프트웨어의 전체 구조를 가장 먼저 생각
• 소프트웨어의 구조를 이루는 각 구성 요소를 찾음
• 각 구성 요소 간의 명확한 관계를 설정
• 일정한 규칙을 따름

• 아키텍처의 필요성

• 복잡하고 규모가 큰 소프트웨어를 개발하려면 전체적인 구조가 유기적으로 잘 구성되어야 함

• 잘 정의된 구조의 품질 좋은 소프트웨어를 만 들려면 소프트웨어 아키텍처가 필요

• 아키텍처 설계로 소프트웨어가 어떤 구조이고 어떻게 동작할 것인지를 예측할 수 있으며, 변경에 유연하게 대처 가능


background image

01. 아키텍처 설계

아키텍처 설계

아키텍처의 특징과 기능
• 아키텍처의 특징

• 소프트웨어의 골격을 나타내는 추상화된 전체 구조를 제공

• 소프트웨어를 이루고 있는 여러 구성 요소(서브시스템, 컴포넌트)를 다룸

• 인터페이스를 통해 소프트웨어의 구성 요소가 어떻게 상호작용하는지를 정의

• 세부 내용보다는 중요 내용(설계자가 주관적으로 판단하고 결정)만 다룸

• 설계에 적용되는 원칙과 지침이 있음

• 아키텍처 설계 시 고려 사항

• 모든 이해관계자 사이의 의사소통 도구로 활용할 수 있어야 함

• 구현에 대한 제약 사항(개발 비용, 기간, 조직의 역량 등)을 정의해야 함

• 모든 이해관계자의 품질 요구사항을 반영해 우선순위에 따라 시스템 품질 속성을 결정해야 함

• 성능, 사용성, 보안성, 안정성, 검증 가능성, 변경 용이성 등

• 특정 문제 영역에 적합한 소프트웨어의 구성 요소를 표준화하고 패턴화해 재사용할 수 있도록 설계해야 함


background image

01. 아키텍처 설계

아키텍처 설계

아키텍처의 특징과 기능
• 아키텍처의 기대 효과

• 소프트웨어의 기본 골격이 만들어져 개발에 참여하는 사람들의 이해의 폭이 넓어지며 구현상의 문제점을 도출할 수 있음

• 소프트웨어 아키텍처를 기반으로 분할 방법을 찾고 구조화를 위한 구체적인 방안을 생각할 수 있음

• 설계의 원칙과 가이드를 제공할 수 있고 설계를 재사용할 수 있음

• 소프트웨어 아키텍처를 기준으로 개발 조직을 만들 수 있음

• 전사 조직을 소프트웨어 아키텍처에 맞게 재편할 수 있음

• 품질 특성에 대한 평가 방법을 결정할 수 있음


background image

01. 아키텍처 설계

아키텍처의 품질 속성

• 품질 속성의 개요

• 사용성

, 이식성, 유지보수 용이성과 같이 이해관계자의 요구사항과 관심사를 반영한 것

• 품질 요구사항

: 이해관계자들이 아키텍처에 요구하는 수준의 품질 속성, 가능한 정확한 수치로 제시되는 것이 좋음

• 품질 속성을 반영하는 방법

해당 프로젝트에서 중요하게 생각하는 품질 속성을 결정

결정한 품질 속성을 어느 정도 수준으로 설계할 것인지 목표를 설정

설정한 목표를 달성할 수 있는 방법을 서술

품질 속성을 평가할 방법을 서술

• 예시) 중요한 품질 속성으로 보안성을 결정할 경우 

• 계층 구조 아키텍처를 선택하고 보호 해야 할 요소를 가장 깊숙한 내부 계층에 둠

• 이 계층의 데이터는 높은 등급의 보안 인증을 통과해야만 사용할 수 있도록 설계


background image

01. 아키텍처 설계

아키텍처의 품질 속성

시스템 품질 속성 
• 가용성

• 시스템이 실패 없이 운용될 수 있는 확률로 시스템이 장애 발생 없이 서비스를 제공할 수 있는 능력

• 가용성이 99.99%라면 제대로 동작하지 않을 확률이 0.01%라는 의미

• 하드웨어는 가용성을 높이기 위해 이중화 설계를 함 

• 이중화 설계: 하나의 시스템이 중단 되어도 바로 또 다른 시스템이 가동

• 변경 용이성

• 사용자가 새로운 요구사항을 요청했을 때 얼마나 쉽게 변경할 수 있는지를 말함

• 변경 용이성을 위해서는 추적이 가능하도록 아키텍처를 설계해 변경 발생 시 영향이 미치는 곳을 쉽게 찾을 수 있어야 함

• 변경이 자주 발생하는 소프트웨어는 아키텍처를 설계할 때 변경 용이성을 다른 품질 속성보다 우선으로 고려

• 성능

• 사용자 요청과 같은 이벤트가 발생했을 때 얼마나 빠르고 효율적으로 기능을 수행 할 수 있는가를 말함

• 성능이 좋고 나쁨은 사용자 요청에 관한 결과를 제공하는 대기시간이나 초당 처리할 수 있는 트랜잭션의 수로 표현

• 성능이 중요한 소프트웨어 라면 공유 자원을 어떻게 사용해서 설계하는지와 어떤 알고리즘을 선택하는지가 중요


background image

01. 아키텍처 설계

아키텍처의 품질 속성

시스템 품질 속성 
• 보안성

• 허용되지 않은 접근에 대응할 수 있는 능력

• 시스템 접근의 적법성을 가려서 승인되지 않은 사용을 차단하고 올바른 사용자에게 서비스가 제공될 수 있게 설계

• 네트워크를 통해 데이터를 주고받을 때는 보안유지를 위해 

DoS 공격을 실시간으로 탐지해야 하고 회피 전략을 설립

보안성 속성이 중요하다면 인증받은 일부만 접근할 수 있도록 계층 구조 아키텍처를 사용해 가장 안쪽 계층에 자료를 저장

• 사용성

• 시스템을 사용할 때 발생할 수 있는 여러 가지 상황을 극복할 수 있도록 이를 반영해 아키텍처 설계 작업을 해야함

• 시스템의 도움말 기능은 사용자에게 실제 도움을 줄 수 있어야 함

• 사용자가 원치 않는 상황에 놓인 경우에도 친숙한 사용자 인터페이스를 제공해 당황하지 않도록 설계해야 함

• 사용자의 실수에도 오류의 영향을 최소화하도록 되돌리기나 취소 기능을 제공해야 함

• 테스트 용이성

테스트 비용을 줄이기 위해서는 아키텍처 설계부터 테스트를 고려해야 함

테스트가 얼마나 효과적으로 수행되는지, 소요되는 시간을 얼마나 단축할 수 있는지 와 같은 요소를 아키텍처 설계에 반영


background image

01. 아키텍처 설계

아키텍처의 품질 속성

비즈니스 품질 속성
• 시장 적시성

• 적정한 시기에 소프트웨어를 출시해 경쟁력을 높이는 것

• 아키텍처 설계를 할 때 구매한 컴포넌트들이 잘 맞을 수 있도록 범용성 높은 설계가 필요

• 비용과 이익

• 아키텍처를 설계할 때 비용을 많이 들여 유연한 설계를 할 것인지, 비용을 절감해 이익을 높일 것인지 판단

• 개발 시점에서 비용을 더 들여 유연한 시스템을 만들면 나중에 수정 및 유지보수가 쉬운 시스템

• 비용 절감에 초점을 두면 우선 개발 비용이 적게 드는 효과는 있지만

, 유지보수를 할 때 비용 증가

• 예상 시스템 수명

• 시스템을 구축할 때는 시스템 사용 기간을 예측해 아키텍처 설계에 반영

• 예상 시스템 수명을 위해서는 확장성, 이식성과 같은 아키텍처 품질 속성을 고려해야 함

• 목표 시장

• 목표 시장이 있는 소프트웨어는 경쟁 제품과 비교했을 때 기능성이 매우 중요 

• 다양한 플랫폼에서 잘 작동해야 하므로 시스템 품질 속성 중 이식성을 충분히 고려해야 함


background image

01. 아키텍처 설계

아키텍처의 품질 속성

비즈니스 품질 속성
• 신규 발매(공개) 일정

공지한 일정에 개발을 못 맞출 경우에는 현재  전에서는 기본 기능만 제공하고 차기 버전에서 기능을 추가해 완성도를 올림 

• 아키텍처 설계 시 유연성과 확장성을 중요하게 고려해야 함

• 기존 시스템과의 통합

• 개발할 시스템을 기존 시스템과 통합해야 한다면 기존 시스템의 특성을 잘 파악해야 함

• 기존에 사용하던 

DBMS나 개발 시 제약 사항을 충분히 고려한 아키텍처 설계가 필요


background image

01. 아키텍처 설계

아키텍처의 품질 속성

아키텍처 품질 속성
• 개념적 무결성

• 시스템 설계는 전체 시스템을 나타내는 설계와 세부 구성 요소 설계로 나뉨

• 세부 구성 요소를 전체 시스템으로 통합하더라도 일관성이 유지되어야 하기 때문

• 전체 시스템과 시스템 구성 요소가 일관되도록 아키텍처를 결정해야 함

• 정확성과 완전성

• 정확성과 완전성은 사용자가 요구하는 기능을 충족시키는 정도를 말하며 요구분석명세 와 일치하는 정도를 나타냄

• 개발 용이성(구축 가능성)

• 전체 시스템을 적절한 모듈로 분할한 후 알맞게 분배해 개발함으로써 정해진 기간 내에 개발을 완성할 수 있고 개발 과정 중에도 

쉽게 변경 할 수 있는 능력을 말함


background image

01. 아키텍처 설계

아키텍처의 

4+1 관점

4+1 관점

• 관점

: 시스템을 이루는 요소의 집합과 그들의 연관 관계를 추상적으로 표현한 것

4+1 관점은 크루첸이 1995년에 쓴 논문에 처음 등장

• 문제 영역의 1개 관점(시나리오 관점)과 해법 영역의 4개 관점(논리적 관점

, 프로세스 관점, 개발 관점, 물리적 관점)으로 이루어짐


background image

01. 아키텍처 설계

아키텍처의 

4+1 관점

• 시나리오(유스케이스) 관점

• 최종 사용자가 인식하는 시스템의 기능을 의미

• 시스템이 사용자에게 제공하는 기능에 주목하는 관점

• 기능 하나하나가 유스케이스로 표현되기 때문에 유스케이스 관점이라 할 수 있음

• 사용 다이어그램

• 정적 표현: 유스케이스 다이어그램 
• 동적 표현: 상태 다이어그램, 순차 다이어그램, 통신 다이어그램, 활동 다이어그램

• 논리적(디자인) 관점 

• 시스템의 기능에 관심이 있는 유스케이스 관점과 달리 시스템 내부를 들여다봄

• 시스템의 기능을 제공하기 위해 필요한 클래스나 컴포넌트 및 이들의 관계에 초점

• 사용 다이어그램

• 정적 표현: 클래스 다이어그램, 객체 다이어그램 
• 동적 표현: 상태 다이어그램(클래스 내의 동작 표현), 순차·통신 다이어그램(클래스 간 상호 작용 표현), 

              활동 다이어그램(클래스의 연산 동작 표현) 


background image

01. 아키텍처 설계

아키텍처의 

4+1 관점

• 개발(구현) 관점

• 물리적 시스템에서 사용하는 소프트웨어 서브시스템의 모듈(원시 코드

, 데이터 파일, 컴포넌트, 실행 파일 등으로 구성)이 서로 

어떤 연관 관계가 있고 또 설계와 어떻게 연결 관계를 나타내는지에 관심

• 사용 다이어그램

• 정적 표현: 컴포넌트 다이어그램 
• 동적 표현: 상태 다이어그램, 순차·통신 다이어그램, 활동 다이어그램

• 물리적(배치) 관점

• 시스템에서 필요한 하드웨어 환 경을 포함해 시스템을 구성하는 처리 장치 간의 물리적인 배치에 초점

• 사용 다이어그램

• 정적 표현: 배치 다이어그램 
• 동적 표현: 상태 다이어그램, 순차 다이어그램, 통신 다이어그램, 활동 다이어그램


background image

01. 아키텍처 설계

아키텍처 스타일

• 아키텍처 스타일은 각각의 특징이 있고 해당 스타일만의 구성과 모양을 가지고 있음


background image

01. 아키텍처 설계

아키텍처 스타일

데이터 중심형 스타일

• 가장 큰 특징은 주요 데이터가 리포지토리에서 중앙 관리된다는 점

• 리포지토리와 여기에 접근하는 서브시스템으로 구성

• 시스템에서 공동으로 활용하는 데이터는 리포지토리에 보관

• 대량의 데이터를 공유하는 은행 업무 시스템에 매우 유용

• 서브시스템과 리포지토리의 결합도가 높아 리포지토리를 변경하면 서브시스템에 영향을 줄 수 있다는 단점


background image

01. 아키텍처 설계

아키텍처 스타일

클라이언트-서버 스타일

• 네트워크를 이용하는 분산 시스템 형태로 데이터와 처리 기능을 클라이언트와 서버에 분할해 사용

• 서버

, 서비스, 클라이언트로 구성되며 서브시스템(컴포넌트)이 서비스를 서로 요청하면서 상호작용

• 서버 특성 

• 클라이언트(서브시스템)에 서비스를 제공하는 역할을 하므로 클라이언트의 요청을 처리하기 위해 대기

• 요청을 처리한 후에는 결과를 클라이언트에 회신

• 프린트 서버

, 파일 및 FTP 서버, 메일 서버, DNS 서버 등이 이에 해당

• 클라이언트 특성 

• 사용자와 대화하기 위해 서버가 제공하는 서비스를 요청(호출)하는 서브시스템

• 메시지나 원격 프로시저 호출을 통해 서비스를 요청하고 서버가 이 요청을 받아 수행하면 그 결과를 클라이언트에게 전송

• 클라이언트가 서버에 서비스를 요청할 때는 서버의 이름과 제공서비스를 알아야 함

• 인터넷을 통해 웹서버와 통신해 웹 페이지를 다운로드하고 사용자에게 보여주는 웹브라우저가 해당


background image

01. 아키텍처 설계

아키텍처 스타일

클라이언트-서버 스타일(비중의 분산

)

• 씬 클라이언트 스타일 

• 데이터 관리가 서버에서 수행되며 클라이언트는 프레젠테이션 계층만 구현

• 데이터 관리가 거의 필요 없는 애플리케이션이나 응용 처리가 거의 필요 없는 데이터 중심의 애플리케이션의 경우에 적합

• 서버와 네트워크에 걸리는 부하가 큰 것이 단점

 

• 팻 클라이언트 스타일

• 서버에서 데이터 관리만 관여하고 애플리케이션로직 과 프레젠테이션의 많은 부분이 클라이언트 쪽에서 구현

• 클라이언트에 더 많은 부하가 걸릴 수밖에 없으므로 클라이언트 컴퓨터의 사양이 충분할 경우에 사용 

• 씬 클라이언트 스타일보다 관리하기가 복잡하고 새로운 버전이 출시되면 모든 클라이언트에 배포 및 설치해야 함


background image

01. 아키텍처 설계

아키텍처 스타일

계층 스타일

• 기능을 몇 개의 계층으로 나누어 배치

• 데이터베이스를 많이 이용하는 소프트웨어는 

3-계층으로 구성

• 각 계층의 응집도는 높고 계층 간 결합도는 낮아 재사용 및 유지보수가 용이한 것이 장점

• 계층 간 역할 분담이 명확해 각 계층을 쉽게 변경할 수 있음

• 대부분의 운영체제와 통신 시스템이 계층 스타일을 이용


background image

01. 아키텍처 설계

아키텍처 스타일

계층 스타일
• 프레젠테이션 

• 클라이언트 계층으로서 사용자와 직접 만나는 화면에 해당

• 사용자 인터페이스를 지원하며 front-end라고도 함

• 비즈니스 로직 계층 

• 기능 요구사항을 구현하는 곳으로 미들웨어라고도 함

• 애플리케이션 로직을 실행하고 또 어떤 형태의 데이터가 필요하고 반환될 것인지를 결정

• 데이터 계층 

• 데이터베이스에 접근해 데이터 처리와 관리를 하며 필요한 데이터를 제공

back-end라고도 함


background image

01. 아키텍처 설계

아키텍처 스타일

MVC 스타일

• 구성요소를 기능별 또는 특성별로 명확하게 분리해 유지보수를 쉽게 하고 프로그램의 확장성과 유연성을 높임

• 모델, 

뷰, 제어의 세 부분으로 이루어짐

• 뷰와 모델을 독립적으로 분리해 변경에 대한 영향이 덜 미치도록 한 것이 장점

• 약한 결합으로 설계하여 서로 영향을 덜 미치기 때문에 구조 변경을 요청할 때 수정하기가 쉬움

사용자는 제어에게 자료를 요청하거나 처리할 데이터를 전송

제어는 이를 처리하기 위해 모델을 호출

모델은 

DBMS를 이용해 데이터베이스의 자료를 수정하고 그 결과를 제어에게 반환

제어는 사용자가 요청한 결과를 모델로부터 가져와 뷰를 호출하고 결과를 전달

뷰는 처리 결과를 여러 형태(테이블

, 그래프, 액셀 등)로 사용자에게 공개


background image

01. 아키텍처 설계

아키텍처 스타일

데이터 흐름 스타일

• 서브시스템이 하나의 데이터를 입력으로 받아서 처리한 후 그 결과를 다음 서브시스템으로 넘겨주는 과정을 반복함

• 일반적으로 데이터를 변환하는 시스템에서 주로 사용하며

, 전체 변환 작업은 독립적인 단계로 나뉠 수 있음

• 파이프와 필터를 조합해 만드는 아키텍처에 적합하고 사용자의 개입 없이 데이터 흐름이 전환되는 경우에 사용

• 필터 또는 파이프 단위로 나누어 개발할 수 있기 때문에 동시에 개발이 가능하다는 것이 장점

• 필터

: 데이터 스트림을 하나 이상 입력받아 처리(변환)한 후 데이터 스트림 하나를 출력,

           하나의 필터는 여러 포트로 데이터를 보낼 수 있음

• 파이프

: 필터를 거쳐 생성된 데이터 스트림 하나를 다른 필터의 입력에 연결


background image

01. 아키텍처 설계

아키텍처 스타일

아키텍처 스타일의 장점
1. 개발 기간 단축 및 고품질의 소프트웨어 생산

• 시행착오를 줄임으로써 개발 기간을 많이 단축 할 수 있고 고품질의 소프트웨어를 만들 수 있음

2. 수월한 의사소통

• 아키텍처에 익숙한 개발자끼리 공통된 아키텍처를 공유함으로써 의사소통이 수월해짐

3. 용이한 유지보수

• 개발에 참여하지 않은 사람이라도 비즈니스 로직만 잘 이해하고 있으면 유지 보수의 어려움을 많이 줄일 수 있음

4. 검증된 아키텍처

• 사용을 통해 이미 검증된 아키텍처 스타일이므로 안정적으로 개발할 수 있음

5. 구축 전 시뮬레이션 가능

• 이미 알려진 아키텍처 스타일을 이용하면 시스템을 개발하기 전에 시스템 특성을 시뮬레이션해볼 수 있음

6. 기존 시스템에 대한 빠른 이해

• 기존 시스템이 어떤 아키텍처 스타일로 개발되었는지 알면 그 시스템을 더 빨리 이해할 수 있음


background image

02. 클래스 간의 관계 

연관 관계 

양방향 연관 관계

• 단순한 연관 관계로 ‘교수는 학생에게 수업하고

, 학생은 교수에게 수업을 받는다’

로 해석

역할이 부여된 연관 관계 

• 연관 관계에서 각자에게 역할을 부여할 수 있음

• 교수의 역할은 ‘강의자’라 할 수 있고 학생의 역할은 ‘수강자’


background image

02. 클래스 간의 관계 

연관 관계 

다중 연관 관계

• 다중 관계는 다양하게 나올 수 있으며 선 위에 다중성을 표기해 나타냄

• 일 대 다

(1 : n) 관계의 예는 교수 1명이 여러 명의 학생을 가르치는 관계라 할 수 있음

• 4명의 교수가 다수의 학생을 가르칠 경우도 있음

• 다 대 다 관계는 실제로 구현하기가 어려우므로 일 대 다 관계를 변환해 사용하는 것이 좋음


background image

02. 클래스 간의 관계 

연관 관계 

단방향 연관 관계

• 두 클래스가 서로 아는 관계가 아니고 한쪽만 아는 관계를 나타냄

• 두 클래스 간의 연결선이 방향성을 나타내는 화살표가 있는 직선 실선

연관 클래스 

• 연관 관계를 더 구체적으로 나타내고 싶을 때 클래스를 추가해 사용하는 것

• 점선을 사용해 나타내며

, 일반 클래스처럼 다른 클래스와도 연관 관계를 맺을 수 있


background image

02. 클래스 간의 관계 

일반화 관계

• 일반화와 상속

• ‘일반적’의 사전적 의미: 일부에 한정되지 아니하고 전체에 걸치는 것

 , 보편적이고 상식적인 것

• 클래스에서 일반화

: 공통점을 가지고 있는 여러 개의 클래스를 묶어서 새로운 클래스를 만들고 공통적인 이름을 붙인 것

• 일반화 관계는 상속 구조이며 하위 클래스는 상위 클래스의 모든 것(속성, 메서드)을 상속받아 사용

• 아래에서 위로 추상화되는 것을 일반화, 반대로 위에서 아래로 구체화하는 것을 특수화라고 함

• 개별 클래스와 공통 클래스 사이에 ‘

is a kind of’ 관계가 성립되어야 함

• is a kind of 관계: ‘사각형은 도형의 일종이다’, ‘원은 도형의 일종이다’ 


background image

02. 클래스 간의 관계 

집합 관계

• 집합 관계

• ‘상위 클래스가 하위 클래스로 구성될 때의 관계로 ‘

is composed of’가 성립되어야 함

• is composed of 관계: ‘컴퓨터는 모니터, 본체, 키보드로 이루어졌다’라고 할 때 말이 되는 관계

• 모든 객체가 별개의 생명주기를 가지고 있으며 각각 독립적으로 동작하기 때문에 약한 결합 관계

집합 관계에서 전체(컴퓨터)와 부분(모니터

, 본체, 키보드)의 연결은 직선으로 하되 머리 부분은 속이 비어 있는 마름모 모양


background image

02. 클래스 간의 관계 

합성 관계

합성 관계

• 집합 관계와 많은 부분이 유사하지만 전체 객체에 완전히 종속되어 독립된 객체로 존재할 수 없다는 것이 다름

• 모든 객체가 같은 생명주기를 가지고 있으므로 각각 독립적으로 동작할 수 없는 강한 결합 관계

• 전체(노트북)와 부분(모니터

, 본체, 키보드)의 연결은 직선으로 하되 머리 부분은 속이 채워진 마름모 모양


background image

02. 클래스 간의 관계 

의존 관계

• 연관 관계와 의존 관계의 차이점

서로 상대의 클래스를 사용(참조)할 때의 관계로 클래스 A의 변화는 클래스 B의 변화로 연결되는 점에서 연관 관계와 유사

• 연관 관계는 상대 클래스를 인식하기 위해 멤버 변수를 가짐

• 클래스 A인 Repeater 클래스가 클래스 B인 Scan 클래스를 멤버 변수로 가지고 있음


background image

02. 클래스 간의 관계 

의존 관계

• 연관 관계와 의존 관계의 차이점

• 의존 관계는 상대의 메서드를 가지고 있음

• 예시

) 클래스 A의 메서드가 클래스 B의 객체를 인자로 받아 그 메서드를 사용할 경우

• 색 글자로 표시된 부분을 보면 Scan 클래스를 인자(파라미터)로 받아 사용


background image

02. 클래스 간의 관계 

의존 관계

• 연관 관계와 의존 관계의 차이점

• 의존 관계는 상대의 메서드를 가지고 있음

• 예시

) 클래스 A인 Repeater 클래스의 메서드인 repeat() 내부에서 클래스 B의 객체를 생성해 메서드를 사용할 경우

• 클래스 A인 Repeater 클래스는 클래스 B인 Scan 클래스를 지역 변수로 사용


background image

02. 클래스 간의 관계 

의존 관계

• 실체화 관계

• 특정 클래스에 기능을 추가하기 위해 메서드를 넣을때 하위 클래스가 상속을 무조건 받아야 하는 사태가 발생

• 인터페이스 클래스는 메서드의 공통 특성을 묶어 새로운 인터페이스 클래스를 만들고 공통의 이름을 붙임

• 이 클래스는 변수를 정의할 수 없고 추상 메서드를 가지며 이 메서드에 대한 구체적인 실현은 하위 클래스에서 구현

• 스테레오타입으로 <<>>를 사용하고 하위 클래스와의 연관은 일반화 관계와 다르게 점선으로 나타냄

• 화살표의 머리 부분은 하위 클래스에서 상위 클래스로 향하며 모양은 속이 빈 삼각형


background image

03. 클래스 설계 원칙

단일 책임 원칙 

(SRP)

• 단일 책임 원칙 

• 로버트 마틴

: 책임의 의미는 변경하는 이유

• 단일 책임의 원칙은 클래스를 설계할 때 변경하는 이유가 하나가 되도록 해야 한다는 것

• 모든 클래스는 한 가지 책임, 즉 변경의 이유를 오직 하나만 갖도록 설계하고 클래스는 그 책임을 완전히 캡슐화하는 것

클래스에 2개의 책임이 존재한다면 2개의 클래스로 분리해 ‘변경해야 하는 이유가 오직 하나 가 되도록’ 설계하는 것이 바람직

단일 책임 원칙

: 클래스를 변경해야 하는 이유는 단 하나여야 한다.


background image

개방 폐쇄 원칙 

(OCP)

• 개방 폐쇄 원칙 

• 어떤 것은 개방하고 어떤 것은 폐쇄하는 것을 말함

• Video_Palyer 클래스의 예시: 원칙 위반

• 처음에는 MP4만 지원하던 Video_Palyer 클래스에 지원가능한 파일 형식이 늘어날때마다 클래스를 수정

• 개방 폐쇄 원칙을 따르지 않으면 지원 가능한 파일 형식이 늘어날 때마다 계속 클래스를 수정해야 함

03. 클래스 설계 원칙

개방 폐쇄 원칙

: 변경에는 닫혀 있어야 하고, 확장에는 열려 있어야 한다.


background image

개방 폐쇄 원칙 

(OCP)

• Video_Palyer 클래스의 예시: 원칙 적용

• 계속해서 바뀌는 것이 무엇인지를 찾고 그것들을 모아 상속 구조로 만들어 상위 클래스에 배치
• 하위 클래스에는 코덱의 종류를 배치해 계속 추가할 수 있도록 함
• Video_Player 클래스에서 이들을 호출해 사용하도록 설계

• 개방 페쇄 원칙의 장점

• 변경에 닫혀 있는 설계

: 계속된 추가 사항이 있어도 그들끼리만 추가할 수 있도록 설계

• 확장에 열려 있는 설계: 새로운 클래스를 쉽게 추가할 수 있는 구조로 설계

03. 클래스 설계 원칙


background image

리스코프 교체 원칙

 (LSP)

• 리스코프 교체 원칙 

• 상위 클래스의 객체가 들어갈 자리에 하위 클래스의 객체를 넣어도 문제없이 잘 작동해야 함

• 리스코프 교체 원칙은 상속과 재정의의 중요성을 강조함

LSP를 지키는 클래스 설계를 위해서는 상속 구조를 만들 때 상위 클래스 추상 클래스와 추상 메서드여야 함

• 재정의를 사용할 때는 피터 코드의 상속 규칙에 맞게 사용해야 함

• 피터 코드의 상속 규칙: ‘하위 클래스는 상위 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행한다’

03. 클래스 설계 원칙

리스코프 교체 원칙

상위 클래스의 객체는 언제나 자신의 하위 클래스의 객체로 교체할 수 있어야 한다.


background image

리스코프 교체 원칙

 (LSP)

• 리스코프 교체 원칙: 대학의 강사료 계산 프로그램의 예시

03. 클래스 설계 원칙


background image

리스코프 교체 원칙

 (LSP)

• 리스코프 교체 원칙: 대학의 강사료 계산 프로그램의 예시

• 이 클래스 다이어그램은 

Lecturer()를 하위 클래스에서 재정의해 사용함

• 상위 클래스의 

Lecturer()를 대학원 시간 강사의 Lecturer()로 대체하면 문제가 발생

• 일반 강사의 강사료는 90,000, 대학원 시간 강사의 강사료는 180,000원으로 대체 시 일반 강사가 180,000를 받게됨
• 재정의를 무분별하게 사용했기 때문에 오류가 발생

03. 클래스 설계 원칙


background image

리스코프 교체 원칙

 (LSP)

• 리스코프 교체 원칙: 대학의 강사료 계산 프로그램의 예시

• 재정의는 상위 클래스의 메서드가 추상 메서드일 경우에만 사용

03. 클래스 설계 원칙


background image

의존 관계 역전 원칙 

(DIP)

의존 관계 역전 원칙 

• 객체지향 설계에서 서로의 관계가 의존적이라는 것은 결합도가 높다는 것이고 이는 클래스 설계에서 좋은 관계가 아님

• 의존 관계 역전 원칙에서는 구체 클래스에 의존하도록 클래스 설계를 하지 않고 자주 바뀌는(추가/삭제) 클래스를 상속 구조로 

만들어 추상 클래스에 의존하도록 설계

• ‘고수준 구성 요소가 저수준 구성 요소에 의 존하면 안된다’는 의미

03. 클래스 설계 원칙

의존 관계 역전 원칙

클라이언트는 구체 클래스가 아닌 추상 클래스(인터페이스)에 의존해야 한다


background image

의존 관계 역전 원칙 

(DIP)

GameServer 클래스의 예시: 원칙 위반

• 조건문을 추가하여 조건의 변화(추가/삭제)에 따라 수정할 수밖에 없다는 것을 의미하므로

O CP(개방 폐쇄 원칙) 위반

• 구체 클래스인 

GameServer에서 직접 생성하면 GameServer 클래스는 생성된 모든 게임 클래스에 직접 의존

• 각 게임 클래스가 업데이트 될 경우 

GameServer 클래스는 객체선언부터 조건문까지 모두 변경해야함

03. 클래스 설계 원칙


background image

의존 관계 역전 원칙 

(DIP)

GameServer 클래스의 예시: 원칙 적용

• 게임을 쉽게 추가/삭제할 수 있도록 상속 구조로 만듬

GameServer 클래스가 추상 클래스인 Games를 참조하도록 만듬

• 클래스 다이어그램을 보면 

GameServer가 Games라는 추상 클래스에 의존

• 모든 게임 클래스도 추상 클래스인 Games에 의존

03. 클래스 설계 원칙


background image

의존 관계 역전 원칙 

(DIP)

GameServer 클래스의 예시: 원칙 적용

03. 클래스 설계 원칙


background image

의존 관계 역전 원칙 

(DIP)

GameServer 클래스의 예시: 원칙 적용

03. 클래스 설계 원칙


background image

인터페이스 분리 원칙 

(ISP)

인터페이스 분리 원칙 

• 다수의 클라이언트가 일반적인 인터페이스 하나를 같이 사용하는 것보다 각각의 클라이언트가 필요한 대로 

   여러 개의 구체적인 인터페이스로 분리해 사용하는 것이 더 낫다는 의미

• 무조건 모든 클라이언트에게 각각의 인터페이스를 제공하는 의미가 아님

• 각각의 클라이언트가 필요로 하는 메서드군이 존재할 때 인터페이스를 분리

• 인터페이스 분리 원칙의 장점

• 용도가 명확한 인터페이스를 제공할 수 있어 클래스에 필요한 메서드만 선언할 수 있음

• 시스템의 내부 의존성을 낮춰(낮은 결합

) 리팩토링을 쉽게 해 재사용성을 높일 수 있음

03. 클래스 설계 원칙

인터페이스 분리 원칙

: 클라이언트는 자신이 사용하지 않는 메서드와 의존 관계를 맺으면 안 된다.


background image

인터페이스 분리 원칙 

(ISP)

학사관리 클래스의 예시

: 원칙 위반

• 학사관리 클래스에 많은 메서드가 있고 이 메서드를 학생

, 교수, 직원이 사용

• 학생이 사용하는 것은 수강신청

()과 성적조회()뿐인데 사용하지 않는 다른 메서드와도 연관 관계를 맺고 있음

• 직원과 교수도 마찬가지로 사용하지 않는 메서드와 연관 관계를 맺고 있음

03. 클래스 설계 원칙


background image

인터페이스 분리 원칙 

(ISP)

학사관리 클래스의 예시

: 원칙 적용

• 클래스 다이어그램에서는 사용자(학생

, 직원, 교수)별로 인터페이스를 분리

• 각 사용자는 오직 자신이 필요로 하는 메서드와 연관되어 있고 다른 메서드와는 관계가 없음

• 학생 인터페이스의 수강신청

(), 성적조회()의 구현은 학사관리 클래스에 그대로 남아 있음

• ‘단일 책임 원칙’과 혼동해서는 안됨

03. 클래스 설계 원칙


background image

감사합니다

.

도서에 대한 의견을 남겨주세요

.

 

의견 남기러 가기