[[A]] 소프트웨어 아키텍처
: 소프트웨어를 구성하는 요소들 간의 관계를 표현하는 시스템의 구조 또는 구조체
- 애플리케이션의 분할 방법과 분할된 모듈에 할당될 기능, 모듈 간의 인터페이스 등을 결정함
소프트웨어 아키텍처 설계의 기본 원리 (모추단정)
- 모듈화
- 추상화
- 단계적 분해
- 정보은닉
모듈화 (Modularity)
: 시스템의 기능들을 모듈 단위로 나누는 것
- 모듈의 크기를 너무 작게 나누면 개수가 많아져 모듈 간의 통합 비용이 많이 듦
- 모듈의 크기를 너무 크게 나누면 개수가 적어 통합 비용은 적게 들지만 모듈 하나의 개발 비용이 많이 듦
추상화 (Abstraction) : 전체 → 구체화
: 전체적이고 포괄적인 개념을 설계한 후 구체화시켜 나가는 것
- 완전한 시스템을 구축하기 전에 그 시스템과 유사한 모델을 만들어서 여러 가지 요인들을 테스트할 수 있음
추상화의 유형 (과데제)
과정 추상화 | 자세한 수행 과정을 정의하지 않고, 전반적인 흐름만 파악할 수 있게 설계하는 방법 |
데이터 추상화 | 데이터의 세부적인 속성이나 용도를 정의하지 않고, 데이터 구조를 대표할 수 있는 표현으로 대체하는 방법 |
제어 추상화 | 이벤트 발생의 정확한 절차나 방법을 정의하지 않고, 대표할 수 있는 표현으로 대체하는 방법 |
단계적 분해 (Stepwise Refinement)
: 상위의 중요 개념으로부터 하위의 개념으로 구체화시키는 분할 기법
- Niklaus Wirth에 의해 제안된 하향식 설계 전략
- 소프트웨어의 포괄적인 기능에서부터 시작하여 점차적으로 구체화하고, 알고리즘, 자료 구조 등 상세한 내역은 가능한 한 뒤로 미루어 진행함
정보 은닉 (Information Hiding)
: 모듈 내부에 포함된 절차와 자료들의 정보가 감추어져 다른 모듈이 접근하거나 변경하지 못하도록 하는 기법
- 정보 은닉을 통해 모듈을 독립적으로 수행할 수 있음
- 하나의 모듈이 변경되더라도 다른 모듈에 영향을 주지 않으므로 수정, 시험, 유지보수가 용이함
상위 설계 VS 하위 설계 ( 소프트웨어 개발의 설계 단계)
상위 설계 | 하위 설계 | |
별칭 | 아키텍처 설계, 예비 설계 | 모듈 설계, 상세 설계 |
설계 대상 | 시스템의 전체적인 구조 | 시스템의 내부 구조 및 행위 |
세부 목록 | 구조, DB, 인터페이스 | 컴포넌트, 자료 구조, 알고리즘 |
소프트웨어 아키텍처의 품질 속성
: 소프트웨어 아키텍처가 이해 관계자들이 요구하는 수준의 품질을 유지 및 보장할 수 있게 설계되었는지 확인하기 위해 품질 평가 요소들을 구체화 시켜 놓은 것
품질 평가 요소의 종류
시스템 측면 | 성능, 보안, 가용성, 기능성, 사용성, 변경 용이성, 확장성 등 |
비즈니스 측면 | 시장 적시성, 비용과 혜택, 예상 시스템 수명, 목표 시장, 공개 일정 등 |
아키텍처 측면 | 개념적 무결성, 정확성, 완결성, 구축 가능성, 변경성, 시험성 등 |
소프트웨어 아키텍처의 설계 과정
- 설계 목표 설정
- 시스템 타입 결정
- 아키텍처 패턴 적용
- 서브시스템 구체화
- 검토
협약(Contract)에 의한 설계
: 컴포넌트를 설계할 때 클래스에 대한 여러 가정을 공유할 수 있도록 명세한 것
- 컴포넌트에 대한 정확한 인터페이스를 명세함
명세에 포함될 조건
조건 | 내용 |
선행 조건 (Precondition) | 오퍼레이션이 호출되기 전에 참이 되어야 할 조건 |
결과 조건 (Postcondition) | 오퍼레이션이 수행된 후 만족되어야 할 조건 |
불변 조건 (Invariant) | 오퍼레이션이 실행되는 동안 항상 만족되어야 할 조건 |
[[B]] 아키텍처 패턴 (Patterns)
: 아키텍처를 설계할 때 참조할 수 있는 전형적인 해결 방식 또는 예제
- 소프트웨어 시스템의 구조를 구성하기 위한 기본적인 윤곽을 제시
- 아키텍처 패턴에는 서브시스템 사이의 관계와 여러 규칙/지침 등이 포함되어 있음
주요 아키텍처 패턴의 종류
- 레이어 패턴
- 클라이언트-서버 패턴
- 파이프-필터 패턴
- 모델-뷰-컨트롤러 패턴
레이어 패턴 (Layers pattern)
: 시스템을 계층으로 구분하여 구성하는 고전적인 방법의 패턴
- 하위 계층은 상위 계층에 대한 서비스 제공자가 되고 / 상위 계층은 하위 계층의 클라이언트가 됨
- 서로 마주보는 두 개의 계층 사이에서만 상호작용이 이루어짐
- 대표적으로 OSI 참조 모델이 있음
클라이언트 - 서버 패턴 (Client-Server Pattern)
: 하나의 서버 컴포넌트와 다수의 클라이언트 컴포넌트로 구성되는 패턴
- 사용자가 클라이언트를 통해 서버에 요청하면 클라이언트가 응답을 받아 사용자에게 제공하는 방식
파이프-필터 패턴 (Pipe-Filter Pattern)
: 데이터 스트림 절차의 각 단계를 필터로 캡슐화하여 파이프를 통해 전송하는 패턴
- 앞 시스템의 처리 결과물을 파이프를 통해 전달받아 처리한 후 그 결과물을 다시 파이프를 통해 다음 시스템으로 넘겨주는 패턴을 반복함
- 데이터 변환, 버퍼링, 동기화 등에 주로 사용됨
- 대표적으로 UNIX의 쉘(Shell)이 있음
모델-뷰-컨트롤러 패턴 (Model-View-Controller Pattern)
: 서브시스템을 모델, 뷰, 컨트롤러로 구조화하는 패턴
- 컨트롤러가 사용자의 요청을 받으면 핵심 기능과 데이터를 보관하는 모델을 이용하여 뷰에 정보를 출력하는 구조
- 여러 개의 뷰를 만들 수 있음
- 한 개의 모델에 대해 여러 개의 뷰를 필요로 하는 대화형 애플리케이션에 적합함
기타 패턴
종류 | 내용 |
마스터-슬레이브 패턴 (Master-Slave Pattern) |
슬레이브 컴포넌트에서 처리된 결과물을 다시 돌려받는 방식으로 작업을 수행하는 패턴 |
브로커 패턴 (Broker Pattern) |
사용자가 원하는 서비스와 특성을 브로커 컴포넌트에 요청하면 브로커 컴포넌트가 요청에 맞는 컴포넌트와 사용자를 연결해주는 패턴 |
피어-투-피어 패턴 (Peer-To-Peer Pattern) |
피어(Peer)라 불리는 하나의 컴포넌트가 클라이언트가 될 수도, 서버가 될 수도 있는 패턴 ex) 파일 공유 네트워크 |
이벤트-버스 패턴 (Event-Bus Pattern) |
소스가 특정 채널에 이벤트 메시지를 발행(Publish)하면, 해당 채널을 구독(Subscribe)한 리스너(Listener)들이 메시지를 받아 이벤트를 처리하는 패턴 |
블랙보드 패턴 (Blackboard Pattern) |
모든 컴포넌트들이 공유 데이터 저장소와 블랙보드 컴포넌트에 접근이 가능한 패턴 ex) 음성 인식, 차량 식별, 신호 해석 |
인터프리터 패턴 (Interpreter Pattern) |
프로그램 코드의 각 라인을 수행하는 방법을 지정하고, 기호마다 클래스를 갖도록 구성된 패턴 ex)번역기, 컴파일러, 인터프리터 |
[[A]] 객체지향 (Object-Oriented)
: 소프트웨어의 각 요소들을 객체(Object)로 만든 후, 객체들을 조립해서 소프트웨어를 개발하는 기법
- 구조적 기법의 문제점으로 인한 소프트웨어 위기의 해결책으로 채택되어 사용되고 있음
- 소프트웨어의 재사용 및 확장이 용이하여 고품질의 소프트웨어를 빠르게 개발할 수 있고 유지보수가 쉬움
객체지향의 구성 요소 (객클메)
- 객체 (Object)
- 클래스 (Class)
- 메시지 (Message)
객체지향의 특징 (캡상다연)
- 캡슐화 (Encapsulation)
- 상속 (Inheritance)
- 다형성 (Polymorphism)
- 연관성 (Relationship)
객체 (Object)
: 데이터와 이를 처리하기 위한 함수를 묶어 놓은 소프트웨어 모듈
데이터 | 객체가 가지고 있는 정보로, 속성이나 상태, 분류 등 |
함수 | - 객체가 수행하는 기능으로 객체가 갖는 데이터를 처리하는 알고리즘 - 객체의 상태를 참조하거나 변경하는 수단 |
클래스 (Class)
: 공통된 속성과 연산을 갖는 객체의 집합
- 각각의 객체들이 갖는 속성과 연산을 정의하고 있는 틀
- 클래스에 속한 각각의 객체를 인스턴스(Instance)라고 함
메시지 (Message)
: 객체들 간의 상호작용을 하는데 사용되는 수단으로, 객체에게 어떤 행위를 하도록 지시하는 명령 또는 요구사항
- 메시지를 받은 객체는 대응하는 연산을 수행하여 예상된 결과를 반환함
캡슐화 (Encapsulation)
: 외부에서의 접근을 제한하기 위해 인터페이스를 제외한 세부 내용을 은닉하는 것
- 캡슐화된 객체는 외부 모듈의 변경으로 인한 파급 효과가 적음
- 객체들 간에 메시지를 주고받을 때 상대 객체의 세부 내용은 알 필요가 없으므로 인터페이스가 단순해지고, 객체 간의 결합도가 낮아짐
상속 (Inheritance)
: 상위 클래스의 모든 속성과 연산을 하위 클래스가 물려받는 것
- 하위 클래스는 물려받은 속성과 연산을 다시 정의하지 않아도 즉시 자신의 속성으로 사용할 수 있음
- 하위 클래스는 상속받은 속성과 연산 외에 새로운 속성과 연산을 첨가하여 사용할 수 있음
다형성 (Polymorphism)
: 하나의 메시지에 대해 각각의 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 능력
- 객체들은 동일한 메소드명을 사용하며 같은 의미의 응답을 함
연관성 (Relationship)
: 두 개 이상의 객체들이 상호 참조하는 관계
연관성의 종류
종류 | 의미 | 특징 |
is member of | 연관화 (Association) | 2개 이상의 객체가 상호 관련되어 있음을 의미 |
is instance of | 분류화 (Classification) | 동일한 형의 특성을 갖는 객체들을 모아 구성하는 것 |
is part of | 집단화 (Aggregation) | 관련 있는 객체들을 묶어 하나의 상위 객체를 구성하는 것 |
is a | 일반화 (Generalization) | 공통적인 성질들로 추상화한 상위 객체를 구성하는 것 |
특수화/상세화 (Specialization) |
상위 객체를 구체화하여 하위 객체를 구성하는 것 |
[[A]] 객체지향 분석 및 설계
객체지향 분석 (OOA; Object Oriented Analysis)
: 사용자의 요구사항과 관련된 객체, 속성, 연산, 관계 등을 정의하여 모델링하는 작업
- 개발을 위한 업무를 객체와 속성, 클래스와 멤버, 전체와 부분 등으로 나누어서 분석함
- 클래스를 식별하는 것이 객체지향 분석의 주요 목적
객체지향 분석의 방법론
종류 | 내용 |
Rumbaugh(럼바우) 방법 : 객동기 | 분석 활동을 객체 모델, 동적 모델, 기능 모델로 나누어 수행함 |
Booch(부치) 방법 : 미시적/거시적 | - 미시적(Micro) 개발 프로세스와 거시적(Macro) 개발 프로세스를 모두 사용함 - 클래스와 객체들을 분석 및 식별하고 클래스의 속성과 연산을 정의함 |
Jacobson 방법 : 유스케이스 | 유스케이스(Use Case)를 강조하여 사용함 |
Coad와 Yourdon 방법 : E-R 다이어그램 | - E-R 다이어그램을 사용하여 객체의 행위를 모델링함 - 객체 식별, 구조 식별, 주제 정의, 속성과 인스턴스 연결 정의, 연산과 메시지 연결 정의 등의 과정으로 구성함 |
Wirfs-Brock 방법 : 분석/설계 구분X | 분석과 설계 간의 구분이 없고, 고객 명세서를 평가해서 설계 작업까지 연속적으로 수행함 |
럼바우(Rumbaugh) 분석 기법
: 모든 소프트웨어 구성 요소를 그래픽 표기법을 이용하여 모델링하는 기법
- 객체 모델링 기법(OMT, Object-Modeling Technique)이라고도 함
- 분석 활동은 '객체 모델링 - 동적 모델링 - 기능 모델링' 순으로 이루어짐
객체 모델링 (Object Modeling) |
정보 모델링(Information Modeling)이라고도 하며, 시스템에서 요구되는 객체를 찾아내어 속성과 연산 식별 및 객체들 간의 관계를 규정하여 객체 다이어그램으로 표시하는 것 |
동적 모델링 (Dynamic Modeling) |
상태 다이어그램을 이용하여 시간의 흐름에 따른 객체들 간의 제어 흐름, 상호 작용, 동작 순서 등의 동적인 행위를 표현하는 모델링 |
기능 모델링 (Functional Modeling) |
자료 흐름도(DFD)를 이용하여 다수의 프로세스들 간의 자료 흐름을 중심으로 처리 과정을 표현한 모델링 |
객체지향 설계 원칙
: 변경이나 확장에 유연한 시스템을 설계하기 위해 지켜져야 할 원칙
- SRP, OCP, LSP, ISP, DIP 다섯 가지 원칙의 앞 글자를 따 SOLID 원칙이라고 부름
객체지향 설계 원칙의 종류 (SOLID)
종류 | 내용 |
단일 책임 원칙 (SRP) | 객체는 단 하나의 책임만 가져야 한다는 원칙 |
개방-폐쇄 원칙 (OCP) | 기존의 코드를 변경하지 않고 기능을 추가할 수 있도록 설계해야 한다는 원칙 |
리스코프 치환 원칙 (LSP) | 자식 클래스는 최소한 부모 클래스의 기능은 수행할 수 있어야 한다는 원칙 |
인터페이스 분리 원칙 (ISP) | 자신이 사용하지 않는 인터페이스와 의존 관계를 맺거나 영향을 받지 않아야 한다는 원칙 |
의존 역전 원칙 (DIP) | 의존 관계 성립 시 추상성이 높은 클래스와 의존 관계를 맺어야 한다는 원칙 |
[[A]] 모듈 (Module)
: 모듈화를 통해 분리된 시스템의 각 기능으로, 서브루틴, 서브시스템, 소프트웨어 내의 프로그램, 작업 단위 등을 의미함
- 모듈의 기능적 독립성은 소프트웨어를 구성하는 각 모듈의 기능이 서로 독립됨을 의미함
- 모듈의 독립성은 결합도(Coupling)와 응집도(Cohesoin)에 의해 측정됨
* GOOD = 결합도↓, 응집도↑
결합도 (Coupling)
: 모듈 간에 상호 의존하는 정도, 또는 두 모듈 사이의 연관 관계
- 결합도가 약할수록 품질이 높음
결합도의 종류와 강도 (강한 것부터 내공외제스자)
- 내용 결합도
- 공통 결합도
- 외부 결합도
- 제어 결합도
- 스탬프 결합도
- 자료 결합도
결합도의 종류
종류 | 내용 |
내용 결합도 (BAD) (Content Coupling) |
한 모듈이 다른 모듈의 내부 기능 및 그 내부 자료를 직접 참조하거나 수정할 때의 결합도 |
공통(공유) 결합도 (Common Coupling) |
- 공유되는 공통 데이터 영역을 여러 모듈이 사용할 때의 결합도 - 파라미터가 아닌 모듈 밖에 선언된 전역 변수를 사용하여 전역 변수를 갱신하는 방식으로 상호작용하는 때의 결합도 |
외부 결합도 (External Coupling) |
어떤 모듈에서 선언한 데이터(변수)를 외부의 다른 모듈에서 참조할 때의 결합도 |
제어 결합도 (Control Coupling) |
- 어떤 모듈이 다른 모듈 내부의 논리적인 흐름을 제어하기 위해 제어 신호나 제어 요소를 전달하는 결합도 - 하위 모듈에서 상위 모듈로 제어 신호가 이동하여 하위 모듈이 상위 모듈에게 처리 명령을 내리는 권리 전도 현상이 발생하게 됨 |
스탬프(검인) 결합도 (Stamp Coupling) |
모듈 간의 인터페이스로 배열이나 레코드 등의 자료 구조가 전달될 때의 결합도 |
자료 결합도 (GOOD) (Data Coupling) |
모듈 간의 인터페이스가 자료 요소로만 구성될 때의 결합도 |
응집도 (Cohesion)
: 모듈의 내부 요소들이 서로 관련되어 있는 정도
- 응집도가 강할수록 품질이 높음
응집도의 종류와 강도 (강한 것부터 기순교절시논우)
- 기능적 응집도
- 순차적 응집도
- 교환적 응집도
- 절차적 응집도
- 시간적 응집도
- 논리적 응집도
- 우연적 응집도
응집도의 종류
종류 | 내용 |
기능적 응집도 (GOOD) (Functional Cohesion) |
모듈 내부의 모든 기능 요소들이 단일 문제와 연관되어 수행될 경우의 응집도 |
순차적 응집도 (Sequential Cohesion) |
모듈 내 하나의 활동으로부터 나온 출력 데이터를 그 다음 활동의 입력 데이터로 사용할 경우의 응집도 |
교환(통신)적 응집도 (Communication Cohesion) |
동일한 입력과 출력을 사용하여 서로 다른 기능을 수행하는 구성 요소들이 모였을 경우의 응집도 |
절차적 응집도 (Procedural Cohesion) |
모듈이 다수의 관련 기능을 가질 때 모듈 안의 구성 요소들이 그 기능을 순차적으로 수행할 경우의 응집도 |
시간적 응집도 (Temporal Cohesion) |
특정 시간에 처리되는 몇 개의 기능을 모아 하나의 모듈로 작성할 경우의 응집도 |
논리적 응집도 (Logical Cohesion) |
유사한 성격을 갖거나 특정 형태로 분류되는 처리 요소들로 하나의 모듈이 형성되는 경우의 응집도 |
우연적 응집도 (BAD) (Coincidental Cohesion) |
모듈 내부의 각 구성 요소들이 서로 관련 없는 요소로만 구성된 경우의 응집도 |
팬인(Fan-In) / 팬아웃(Fan-Out)
- 팬인 : 어떤 모듈을 제어하는 모듈의 수 ('나'를 가리키는 모듈 수 (=들어오는))
- 팬아웃 : 어떤 모듈에 의해 제어되는 모듈의 수 (내가 가리켜 나가는 모듈 수 (=나가는))
- 팬인이 높다 == 재사용 측면에서 설계가 잘 되어있다
- 그러나 팬인이 높은 경우 단일 장애점이 발생할 수 있으므로 중점적인 관리 및 테스트가 필요함
* 단일 장애점 : 전체 시스템이 중단되어 버리는 요소
N-S 차트 (Nassi-Schneiderman Chart)
: 논리의 기술에 중점을 두고 도형을 이용해 표현하는 방법
- 박스 다이어그램, Chapin Chart 라고도 함
- GOTO나 화살표를 사용하지 않음
- 3가지 제어 논리 구조로 표현함 (연속, 선택 및 다중 선택, 반복)
- 조건이 복합되어 있는 곳의 처리를 시각적으로 명확히 식별하는 데 적합함
[[A]] 단위 모듈 (Unit Module)
: 한 가지 동작을 수행하는 기능을 모듈로 구현한 것
- 단위 모듈로 구현되는 하나의 기능을 단위 기능이라고 부름
- 독립적인 컴파일이 가능하며, 다른 모듈에 호출되거나 삽입되기도 함
단위 모듈의 구현 과정
- 단위 기능 명세서 작성
- 입/출력 기능 구현
- 알고리즘 구현
IPC (Inter-Process Communication)
: 모듈 간 통신 방식을 구현하기 위해 사용되는 대표적인 프로그래밍 인터페이스 집합
- 복수의 프로세스를 수행하며 이뤄지는 프로세스 간 통신까지 구현이 가능함
IPC 대표 메소드 5가지
메소드 | 특징 |
Shared Memory | 공유 가능한 메모리를 구성하여 다수의 프로세스가 통신하는 방식 |
Socket | 네트워크 소켓을 이용하여 네트워크를 경유하는 프로세스 간에 통신하는 방식 |
Semaphores | 공유 자원에 대한 접근 제어를 통해 통신하는 방식 |
Pipes & named Pipes | - 'Pipe'라고 불리는 선입선출 형태로 구성된 메모리를 여러 프로세스가 공유하여 통신하는 방식 - Pipe는 하나의 프로세스가 이용 중이라면 다른 프로세스는 접근할 수 없음 |
Message Queueing | 메시지가 발생하면 이를 전달하는 방식으로 통신하는 방식 |
단위 모듈 테스트
: 모듈이 정해진 기능을 정확히 수행하는지 검증하는 것
- 단위 테스트(Unit Test)라고도 불림
- 단위 모듈 테스트의 기준은 단위 모듈에 대한 코드이므로 시스템 수준의 오류는 잡아낼 수 없음
테스트 케이스 (Test Case)
: 소프트웨어가 사용자의 요구사항을 정확하게 준수했는지를 확인하기 위한 테스트 항목에 대한 명세서
- 테스트 케이스를 이용하지 않은 테스트는 특정 요소에 대한 검증이 누락되거나 불필요한 검증의 반복으로 인해 인력과 시간을 낭비할 수 있음
ISO/IEC/IEEE 29119-3 표준에 따른 테스트 케이스의 구성 요소
식별자 (Identifier) | 항목 식별자, 일련번호 |
테스트 항목 (Test Item) | 테스트 대상 (모듈 또는 기능) |
입력 명세 (Input Specification) | 입력 데이터 또는 테스트 조건 |
출력 명세 (Output Specification) | 테스트 케이스 수행 시 예상되는 출력 결과 |
환경 설정 (Environmental Needs) | 필요한 하드웨어나 소프트웨어의 환경 |
특수 절차 요구 (Special Procedure Requirement) |
테스트 케이스 수행 시 특별히 요구되는 절차 |
의존성 기술 (Inter-case Dependencies) |
테스트 케이스 간의 의존성 |
[[B]] 공통 모듈
: 여러 프로그램에서 공통으로 사용할 수 있는 모듈
- 자주 사용되는 계산식이나 매번 필요한 사용자 인증과 같은 기능들이 공통 모듈로 구성될 수 있음
- 공통 모듈을 구현할 때는 해당 기능을 명확히 이해할 수 있도록 명세 기법을 준수해야 함
공통 모듈 명세 기법의 종류 (정명완일추)
명세 기법 | 내용 |
정확성 (Correctness) | 시스템 구현 시 해당 기능이 필요하다는 것을 알 수 있도록 정확히 작성함 |
명확성 (Clarity) | 해당 기능을 이해할 때 중의적으로 해석되지 않도록 명확하게 작성함 |
완전성 (Completeness) | 시스템 구현을 위해 필요한 모든 것을 기술함 |
일관성 (Consistency) | 공통 기능들 간 상호 충돌이 발생하지 않도록 작성함 |
추적성 (Traceability) | 기능에 대한 요구사항의 출처, 관련 시스템 등의 관계를 파악할 수 있도록 작성함 |
재사용 (Reuse)
: 이미 개발된 기능들을 새로운 시스템이나 기능 개발에 사용하기 적합하도록 최적화하는 작업
- 새로 개발하는데 필요한 비용과 시간을 절약할 수 있음
- 누구나 이해할 수 있고 사용이 가능하도록 사용법을 공개해야 함
재사용 규모에 따른 분류 (함객, 컴, 애)
함수와 객체 | 클래스나 메소드 단위의 소스 코드를 재사용함 |
컴포넌트 | - 독립적인 업무 또는 기능을 수행하는 실행 코드 기반으로 작성된 모듈 - 컴포넌트 자체에 대한 수정 없이 인터페이스를 통해 통신하는 방식으로 재사용함 |
애플리케이션 | 공통된 기능들을 제공하는 애플리케이션을 공유하는 방식으로 재사용함 |
효과적인 모듈 설계 방안
- 결합도(Coupling)는 줄이고 응집도(Cohesion)는 높여서 모듈의 독립성과 재사용성을 높임
- 복잡도와 중복성을 줄이고 일관성을 유지시킴
- 모듈의 기능은 예측이 가능해야 하며 지나치게 제한적이어서는 안 됨
- 모듈 크기는 시스템의 전반적인 기능과 구조를 이해하기 쉬운 크기로 분해함
- 효과적인 제어를 위해 모듈 간의 계층적 관계를 정의하는 자료가 제시되어야 함
[[A]] 디자인 패턴 (Design Pattern)
: 모듈 간의 관계 및 인터페이스를 설계할 때 참조할 수 있는 전형적인 해결 방식 또는 예제
- 문제 및 배경, 실제 적용된 사례, 재사용이 가능한 샘플 코드 등으로 구성되어 있음
- '바퀴를 다시 발명하지 마라(Don't reinvent the wheel)' 라는 말과 같이, 개발 과정 중에 문제가 발생하면 새로 해결책을 구상하는 것보다 문제에 해당하는 디자인 패턴을 참고하여 적용하는 것이 더 효율적임
- GOF의 디자인 패턴은 생성 패턴, 구조 패턴, 행위 패턴으로 구분됨
생성 패턴 (Creational Pattern) (추빌팩프싱)
: 클래스나 객체의 생성과 참조 과정을 정의하는 패턴
추상 팩토리 (Abstract Factory) |
- 구체적인 클래스에 의존하지 않고, / 인터페이스를 통해 서로 연관/의존하는 객체들의 그룹으로 생성하여 추상적으로 표현함 - 연관된 서브 클래스를 묶어 한 번에 교체하는 것이 가능함 |
빌더 (Builder) |
- 작게 분리된 인스턴스를 건축 하듯이 조합하여 객체를 생성함 - 객체의 생성 과정과 표현 방법을 분리하고 있어, 동일한 객체 생성에서도 서로 다른 결과를 만들어 낼 수 있음 |
팩토리 메소드 (Factory Method) |
- 객체 생성을 서브 클래스에서 처리하도록 분리하여 캡슐화한 패턴 - 상위 클래스에서 인터페이스만 정의하고 / 실제 생성은 서브 클래스가 담당함 - 가상 생성자(Virtual Constructor) 패턴이라고도 함 |
프로토타입 (Prototype) |
- 원본 객체를 복제하는 방법으로 객체를 생성하는 패턴 - 일반적인 방법으로 객체를 생성하며, 비용이 큰 경우 주로 이용함 |
싱글톤 (Singleton) |
- 하나의 객체를 생성하면 생성된 객체를 어디서든 참조할 수 있지만, 여러 프로세스가 동시에 참조할 수는 없음 - 클래스 내에서 인스턴스가 하나뿐임을 보장하며, 불필요한 메모리 낭비를 최소화 할 수 있음 |
구조 패턴 (Structural Pattern) (어브컴데퍼플프)
: 클래스나 객체들을 조합하여 더 큰 구조로 만드는 패턴
어댑터 (Adapter) |
- 호환성이 없는 클래스들의 인터페이스를 다른 클래스가 이용할 수 있도록 변환해주는 패턴 - 기존의 클래스를 이용하고 싶지만 인터페이스가 일치하지 않을 때 이용함 |
브리지 (Bridge) |
- 구현부에서 추상층을 분리하여, 서로가 독립적으로 확장할 수 있도록 구성한 패턴 - 기능 / 구현을 두 개의 별도 클래스로 구현함 |
컴포지트 (Composite) |
- 여러 객체를 가진 복합 객체와 단일 객체를 구분 없이 다루고자 할 때 사용하는 패턴 - 객체들을 트리 구조로 구성하여 디렉터리 안에 디렉터리가 있듯이 복합 객체 안에 복합 객체가 포함되는 구조를 구현할 수 있음 |
데코레이터 (Decorator) |
- 객체 간의 결합을 통해 능동적으로 기능들을 확장할 수 있는 패턴 - 임의의 객체에 부가적인 기능을 추가하기 위해 다른 객체들을 덧붙이는 방식으로 구현함 |
퍼싸드 (Facade) |
- 복잡한 서브 클래스들을 피해 더 상위에 인터페이스를 구성함으로써 서브 클래스들의 기능을 간편하게 사용할 수 있도록 하는 패턴 - 서브 클래스들 사이의 통합 인터페이스를 제공하는 Wrapper 객체가 필요함 |
플라이웨이트 (Flyweight) |
- 인스턴스가 필요할 때마다 매번 생성하는 것이 아니고 가능한 한 공유해서 사용함으로써 메모리를 절약하는 패턴 - 다수의 유사 객체를 생성하거나 조작할 때 유용하게 사용할 수 있음 |
프록시 (Proxy) |
- 접근이 어려운 객체와 여기에 연결하려는 객체 사이에서 인터페이스 역할을 수행하는 패턴 - 네트워크 연결, 메모리의 대용량 객체로의 접근 등에 주로 이용함 |
행위 패턴 (Behavioral Pattern)
: 클래스나 객체들이 서로 상호작용하는 방법이나 책임 분배 방법을 정의하는 패턴
책임 연쇄 (Chain of Responsibility) |
- 요청을 처리할 수 있는 객체가 둘 이상 존재하여 한 객체가 처리하지 못하면 다음 객체로 넘어가는 형태의 패턴 - 요청을 처리할 수 있는 각 객체들이 고리(Chain)로 묶여 있어 요청이 해결될 때까지 고리를 따라 책임이 넘어감 |
커맨트 (커로) (Command) |
- 요청을 객체의 형태로 캡슐화하여 재이용하거나 취소할 수 있도록 요청에 필요한 정보를 저장하거나 로그에 남기는 패턴 - 요청에 사용되는 각종 명령어들을 추상 클래스와 구체 클래스로 분리하여 단순화함 |
인터프리터 (인문) (Interpreter) |
- 언어에 문법 표현을 정의하는 패턴 - SQL이나 통신 프로토콜과 같은 것을 개발할 때 사용함 |
반복자 (Iterator) |
- 자료 구조와 같이 접근이 잦은 객체에 대해 동일한 인터페이스를 사용하도록 하는 패턴 - 내부 표현 방법의 노출 없이 순차적인 접근이 가능함 |
중재자 (Mediator) |
- 수많은 객체들 간의 복잡한 상호작용(Interface)을 캡슐화하여 객체로 정의하는 패턴 - 객체 사이의 의존성을 줄여 결합도를 감소시킬 수 있음 |
메멘토 (Memento) |
- 특정 시점에서의 객체 내부 상태를 객체화함으로써 이후 요청에 따라 객체를 해당 시점의 상태로 돌릴 수 있는 기능을 제공하는 패턴 - Ctrl+Z 와 같은 되돌리기 기능을 개발할 때 주로 이용함 |
옵서버 (Observer) |
- 한 객체의 상태가 변화하면 객체에 상속되어 있는 다른 객체들에게 변화된 상태를 전달하는 패턴 - 일대다의 의존성을 정의함 - 주로 분산된 시스템 간에 이벤트를 생성/발행(Publish)하고, 이를 수신(Subscribe)해야 할 때 이용함 |
상태 (State) |
- 객체의 상태에 따라 동일한 동작을 다르게 처리해야 할 때 사용하는 패턴 - 객체의 상태를 캡슐화하고 이를 참조하는 방식으로 처리함 |
전략 (Strategy) |
- 동일한 계열의 알고리즘들을 개별적으로 캡슐화하여 상호 교환할 수 있게 정의하는 패턴 - 클라이언트는 독립적으로 원하는 알고리즘을 선택하여 사용할 수 있으며, 클라이언트에 영향 없이 알고리즘의 변경이 가능함 |
템플릿 메소드 (Template Method) |
- 상위 클래스에서 골격을 정의하고, 하위 클래스에서 세부 처리를 구체화하는 구조의 패턴 - 유사한 서브 클래스를 묶어 공통된 내용을 상위 클래스에서 정의함으로써 코드의 양을 줄이고 유지보수를 용이하게 해줌 |
방문자 (Visitor) |
- 각 클래스들의 데이터 구조에서 처리 기능을 분리하여 별도의 클래스로 구성하는 패턴 - 분리된 처리 기능은 각 클래스를 방문(Visit)하여 수행함 |
'자격증 > 정보처리기사' 카테고리의 다른 글
[정보처리기사 #6] 화면 설계 (0) | 2024.04.23 |
---|---|
[정보처리기사 #5] 인터페이스 구현 (2) | 2024.04.23 |
[정보처리기사 #3] 통합 구현 (0) | 2024.04.19 |
[정보처리기사 #2] 데이터 입/출력 구현 (0) | 2024.04.17 |
[정보처리기사 #1] 요구사항 확인 (0) | 2024.04.15 |