리팩토링_및_디자인패턴_개요_20140928
Download
Report
Transcript 리팩토링_및_디자인패턴_개요_20140928
정금호
[email protected]
리팩토링 및 디자인패턴 개요
정금호
소프트웨어 개발 경력 30년 (2014년 기준)
아마추어 13년 + 프로페셔널 17년(…ing)
개발 가능 언어 및 개발 도구
C/C++/JAVA/RUBY/ASP/JSP/NODE.JS/…
MSVS/DELPHI/XCODE/ECLIPSE/GCC/VIM/…
WINDOWS/LINUX/WIN-CE/ANDROID/IOS/…
수행 프로젝트
상용 프로젝트 수백건 (App/게임/서비스) 수행
자체 솔루션,서비스/SI 프로젝트 구분 없이 수행
소프트웨어 개발
SOFTWARE DEVELOPMENT
하드웨어(hardware)
컴퓨터의 모든 물리적 부품
입력, 연산, 제어, 기억, 출력 등의 기능 수행
하드웨어
소프트웨어(software)
저장장치에 저장된 특정한 목적의 하나 또
는 다수의 컴퓨터 프로그램
컴퓨터 하드웨어에 직접 명령어를 주거나
다른 소프트웨어에 입력을 제공함으로써,
그것이 수행하도록 구현된 기능
소프트웨어 개발
소프트웨어는 프로그래밍 언어와 개발 도구
를 사용하여 제작
컴파일러, 링커 only
통합개발환경 (IDE) : 컴파일러, 링커, 편집기, 디
버거 등 포함
프로그래밍 언어
C 언어
C++
C#
Java
개발 도구
Microsoft Visual Studio
Borland Enterprise Studio
Xcode
Eclipse
GCC
소프트웨어 개발 방법론
1970년대 – 구조적 프로그래밍
1990년대
“객체지향 프로그래밍” 주류로 자리잡음
“스크럼” 사용 (1990년대 후반)
2000년대
익스트림 프로그래밍 사용 (1999년)
애자일 개념 제창 및 적용 (2005년)
객체 지향 프로그래밍
OOP : Object-Oriented Programming
컴퓨터 프로그램을 명령어 목록에서 보는
시각에서 벗어난 새로운 패러다임
프로그램을 여러 개의 독립 단위(객체,
Object)의 모임으로 바라봄
객체 지향 프로그래밍
프로그램을 유연하고 변경이 용이하게 만듦
대규모 소프트웨어 개발에 사용
프로그래밍을 배우기 쉬움
소프트웨어 개발과 보수를 용이하게 만듦
보다 직관적인 코드 분석을 가능하게 함
객체 지향 언어 구성 요소
Class
같은 종류의 집단에 속하는 속성(attribute)과 행
위(behavior)를 정의한 것
사용자 정의 데이터 형 (user define data type)
Object : Class의 instance(메모리상 할당됨)
Method : Object의 속성을 조작함
객체 지향 언어 특징
자료 추상화 : 캡슐화
상속 : 단일 상속, 다중 상속
다형성 : 오버라이딩, 오버로딩
바인딩 : 정적바인딩, 동적바인딩
객체 지향 언어
C++
C#
Java
Object Pascal, Delphi
Python
Perl
Ruby
Action Script
객체 지향 프로그래밍 단점
느린 개발 속도
처리하고자 하는 업무에 대한 잘못된 이해 또는
분석이 프로그램 구조 자체에 영향을 미침
초기 설계에 많은 시간이 소모됨
느린 실행 속도
추상화에는 상대적으로 많은 컴퓨팅 파워가 소
모됨
객체 지향 프로그래밍 단점
클래스 상속 문제
상위 클래스가 기능의 추가/변경 및 디버깅 등으
로 인해 변화가 생겼을 때, 하위 클래스가 정상
동작할지를 예측하기 힘듦
하위 클래스는 반드시 상위 클래스의 공개된 기
능을 제공해야 하므로 하위 클래스에서 추가된
기능과 더해져서 기능이 많아지고 복잡해짐
상위 클래스에서 파생된 많은 클래스들이 생길
수 있는데, 규모가 커질수록 다양한 클래스가 존
재할 수 있기 때문에 일관성 있게 만들지 않으면
이해하고 사용하기 힘들어짐
UML
통합 모델링 언어 (Unified Modeling
Language)
시스템을 시각화하거나 시스템의 사양이나
설계를 문서화하기 위한 표현 방법
소프트웨어 공학에서 사용되는 표준화된 범
용 모델링 언어
UML 특징
UML 자체는 개발 방법이 아니지만 객체 지
향 소프트웨어 개발 방법론과 잘 어울리도
록 설계됨
UML을 기반으로 한 개발 방법론인
RUP(Rational Unified Process) 등이 만들어
지기도 함
모델
UML의 그래픽 요소는 다이어그램을 그리는 용
도
다이어그램은 시스템을 여러가지 시각에서 볼
수 있는 뷰(View)를 제공
뷰의 집합 = 모델
UML 모델은 시스템 자체의 “목적 행동”을 설명
하는 언어 (시스템 구현 방법을 설명하는 수단
은 아님)
클래스 다이어그램 (Class
Diagram)
클래스, 인스턴스, 인터페이스 등의 정적인
관계를 표현
대부분의 사물은 자신만의 속성과 일정한
행동 수단을 지님
시퀀스 다이어그램 (Sequence
Diagram)
프로그램이 작동할 때 어떤 메소드가 어떤
순서로 실행되는가, 어떤 추상 클래스가 어
떤 순서로 실행되는가를 표현
클래스 다이어그램이 정적인 관계를 표현한
다면, 시퀀스 다이어그램은 동적인 관계를
표현함
소프트웨어 프로젝트
SOFTWARE PROJECT
소프트웨어 개발의 특징
소프트웨어 개발은 공학적 개념과 비공학적
인 개념이 혼재함
개발 기술만으로 성공적인 소프트웨어 개발
은 어려움
비즈니스 영역의 문제와 전략의 이해 및 요
구 사항 도출이 어려움
소프트웨어 프로젝트 여건
IT 기반의 기술 융합/복합으로 고도화된 소
프트웨어 개발 환경
기술적 고도화, 복잡화로 인한 소프트웨어 개발
수요와 사용자 요구 증대
소프트웨어의 규모, 복잡도 및 비용 증가와
시장 적시성 요구됨
소프트웨어 프로젝트 유형
프로젝트 성공 요인은 참여자들의 만족이다?
소프트웨어 프로젝트 문제 원인
기본적인 문제
초기 요구 사항 분석 및 설계 문제, 필요한 개발 스킬
에 맞는 개발자의 부족, 잦은 개발자 교체
관리적인 문제
비용, 일정, 자원 등에 대한 잘못된 예측, 부적절한 감
시 및 감독, 변경에 대한 관리 부재
환경적인 문제
불충분한 개발 도구 및 시설, 부적절한 시스템 엔지
니어링, 외부 자원 의존
국내 소프트웨어 개발 환경 현황
소프트웨어 개발 기술
개발 프로세스에 공학적 방법과 비공학적 관행
혼재 (낮은 생산성과 품질)
소프트웨어 공학 기술에 대한 이해 없이 프로젝
트 수행
소프트웨어 개발 인력
초급 개발 인력 위주의 양적 공급 (중급/고급인
력 부족)
일부 개인의 역량에 의존하는 개발 문화
국내 소프트웨어 개발 환경 현황
소프트웨어 개발 문화
코딩 중심의 개발 조직 : 개발 프로세스 미정립
낮은 소프트웨어 품질 : 해외 진출 걸림돌
사업 환경의 후진성 : 공공 프로젝트 저가 경쟁
경영진/현업의 IT 전략 수립이나 의사 결정 시에
참여 수준 낮음
소프트웨어에 대한 비중 낮음 : 소프트웨어보다
는 하드웨어에 대한 투자가 지나치게 높음
소프트웨어 프로젝트 성공률
출처 : “Crisical success factors for software
projects : comparative study” by Nasir,
Sahibuddin
1994년부터 2008년까지 Chaos Report에서
발표된 프로젝트 성과
소프트웨어 프로젝트 성공 요인
명확한 요구 사항 및 명세
명확한 목적/목표/범위
현실적인 일정
효과적인 프로젝트 기술 및 방법
애자일(agile) 개발 방법
신속하고 효율적인 개발이 가능한 다양한
개발 방법론
불필요한 작업 부담 줄이면서 변화에 쉽게
대응하여 고객의 입장에 초점을 맞춤
다양한 사용자의 요구와 제품 수명 주기가
짧아진 변화에 적응 가능함
애자일 개발 방법론 특징
사회 공학적인 측면으로 소프트웨어 개발에
대해서 접근함
상소 의사 소통을 중시하는 “사람 중심의 개
발 방법론”
어떠한 방법으로 팀을 효율적으로 운영할 것인
가?
어떻게 구성원 들을 고무시키고 협동할 수 있도
록 만들 것인가?
애자일 개발 방법론
익스트림 프로그래밍 (XP)
스크럼 (Scrum)
린 소프트웨어 개발
기능 주도 개발, 테스트 주도 개발
크리스탈 방법론
Extreame Programming (XP)
고객 만족에 포커스를 맞춰서 고객의 요구
변화에 부응할 수 있도록 함
요구 사항이 많거나 잦은 변화가 예상되는
프로젝트를 진행 할 때 활용 가능
수시로 고객과 팀원들 사이에 의사 소통을
하고, 가능한 한 빨리 고객에게 결과물을 전
달하게 만듦
XP 권장 규칙
모든 일을 단순하게 설계한다
정규 일과 시간에만 작업한다
조금씩 자주 결과물을 발표한다
짧은 배포 주기에 맞추어 현실적인 작업 계
획을 만든다
스펙에 없는 것은 절대 추가하지 않는다
사이클을 반복하여 개발한다
수시로 코드를 개선시킨다(refactoring)
XP 권장 규칙
코딩 표준을 정하고 철저하게 준수한다
테스트 코드를 먼저 만든다 (TFD)
모든 테스트를 통과하지 않으면 발표하지
않는다
짝 프로그래밍을 한다
개발팀 내에 사용자가 상주한다 (고객 위주
프로그래밍)
지속적으로 통합한다
소프트웨어 프로젝트 성공률
RUP과 같은 반복 개발(Iterative) 방법과
Agile이 70%에 가까운 성공률을 보임
출처 : Scott Amber 홈페이지 (2011년 분석결과)
소프트웨어 프로젝트 성공률
품질, 가치, 수익(ROI), 일정 별로 구분하여
평가했을 때 다른 방법에 비하여 모든 요인
에서 애자일이 좋은 결과를 보임
리팩토링
REFACTORING
리팩토링이란?
켄트 벡, 존 브랜트, 빌 옵다이크, 돈 로버츠
등의 개발자들이 연구한 결과를 바탕으로
정리된 ‘개발 경험’
‘마틴 파울러’가 정리하여 책으로 출간
리팩토링 유래
초반부터 깔끔한 코드를 작성하는 것은 불
가능하다
깔끔한 코드가 복잡하고 정신 없는 코드보
다 유지보수가 용이하다
최소한의 시간을 투자해서 자신의 코드를
정리하는 것이 이익이다
리팩토링(refactoring)
겉으로 드러나는 기능은 그대로 둔 채, 알아
보기 쉽고 수정하기 간편하게 소프트웨어
내부를 수정하는 작업
사용자가 보는 외부 화면은 그대로 두면서
내부 논리나 구조를 바꾸고 개선하는 유지
보수 행위
리팩토링
결과의 변경 없이 코드의 구조를 재조정
주로 가독성을 높이고 유지보수를 용이하게
함
버그를 없애거나 새로운 기능 추가가 아님
리팩토링 필요성
소프트웨어 설계 개선
소프트웨어 이해도 개선
버그 원인 추적 용이
프로그래밍 속도 개선
리팩토링 필요 시점
같은 작업의 삼진 아웃 때
기능 추가할 때
버그 수정할 때
코드 검수할 때
리팩토링 전제 조건
리팩토링 시에는 반드시 견고한 테스트가
전제되어야 함
리팩토링 자동화 도구를 사용하더라도 테스
트는 필수
모든 테스트를 완전히 자동화하고 결과를
자체적으로 검사하게 해야 함
리팩토링 효용성
프로그램 코드를 알아보기 쉽게 작성
모든 로직을 한곳으로 집중 (중복 제거)
기존 기능 건드리지 않고 확장 가능
최대한 간결한 조건문 구조
리팩토링 접근 방법
“대부분의 프로그래머가 품질에 대해 압박을
받는다지만 일정에 대한 압박만 못하다. 반론
이 있을지도 모르겠지만, 이렇게 일정이 빠듯
할 땐 리팩토링 얘길 꺼내지 말고 몰래 실시하
자.”
“소프트웨어 개발자의 임무는 전무가로서 효
과적인 소프트웨어를 최대한 신속히 제작하기
만 하면 된다. 일정에 쫒기는 팀장은 개발자에
게 최대한의 속도로 작업하길 바라기 마련인데
어떻게 하든 내 소관이다.”
데이터베이스 리팩토링 이슈
문제 :
어플리케이션과 결합된 데이터 스키마가 존재
함
데이터 이전 시 발생하는 리스크가 있음
대안 :
객체 모델과 데이터베이스 모델 사이에 별도의
소프트웨어 계층을 둠
한 모델을 수정할 때 다른 모델은 수정할 필요 없
이 그저 중개 기능만 수정하면 됨 (유연성 발생)
인터페이스 리팩토링 이슈
문제 :
수정하고자 하는 인터페이스를 호출하는 부분
을 모두 찾아서 수정할 수 없는 경우가 있음
대안 :
배포된 인터페이스를 수정해야 할 경우, 기존 인
터페이스와 새 인터페이스를 모두 그대로 유지
시킴
꼭 필요할 때가 아니면 인터페이스를 published
타입으로 만들지 않는 것이 좋음
설계 변경과 리팩토링
문제 :
설계 자체에 오류가 있거나 설계에 대한 결정이
변경되었을 때, 또는 수정하기 힘들 것 같은 민감
한 부분이라고 판단됨
사례 :
프레임워크 선택이나 연동 기술 선택 같은 특정
설계적 판단을 배제한 채 리팩토링을 진행하는
것은 어렵기는 해도 가능함
리팩토링 하면 안 되는 시점
코드를 새로 작성해야 할 때
코드가 제대로 실행되지 않을 때
납기가 임박했을 때
리팩토링과 설계
“리팩토링을 실시하면 유연성을 낮추지 않
고도 더 간결한 설계가 가능해진다. 그래서
설계 과정이 쉬워지고 스트레스도 줄어든
다.”
“잘 돌아갈 정도로만 제일 단순한 솔루션을
구축하자. 유연하고 복잡한 설계가 필요한
상황은 거의 없으니 말이다.”
리팩토링과 성능
“리펙토링을 실시하면 분명 소프트웨어는
더 느려지지만, 소프트웨어 성능을 더 간단
히 조절할 수 있다. 소프트웨어 성능을 올리
려면 먼저 소프트웨어를 튜닝 가능하게 만
들어 놓고 나중에 충분한 속도가 나오게 튜
닝 하는 것이다.”
리팩토링 단서
REFACTORING CLUES
중복 코드 (Duplicated Code)
한 클래스의 두 메서드 안에 같은 코드가 들
어있다
한 클래스의 두 하위 클래스에 같은 코드가
들어 있다
서로 상관 없는 두 클래스 안에 중복된 코드
가 있다
장황한 메서드 (Long Method)
메서드의 기능을 한눈에 알 수 있는 메서드
명을 사용하면 그 메서드 안의 코드를 분석
하지 않아도 됨
최적의 상태로 장수하는 객체 프로그램은
공통적으로 메서드 길이가 짧음
방대한 클래스 (Large Class)
기능이 많은 클래스에는 많은 인스턴스 변
수가 있고, 인스턴스 변수가 많으면 중복 코
드가 존재할 확률이 높다
코드 분량이 많은 클래스에도 중복 코드가
많이 있기 마련이다
과다한 매개 변수 (Long
Parameter List)
객체 지향 프로그래밍 이전에는 전역 데이
터 사용을 피하기 위해 많은 매개 변수를 사
용해왔음
객체를 사용할 때는 메서드에 필요한 모든
데이터를 전달하는 게 아니라 모든 데이터
를 전달할 수 있는 메서드만 전달하면 됨 (메
서드가 필요로 하는 모든 데이터는 그 메서
드가 속한 클래스에 존재하기 때문)
산발적인 수정 (Divergent
Change)
한 클래스가 다양한 원인 때문에 다양한 방
식으로 자주 수정될 때 발생함
소프트웨어에 대한 수정을 할 때, 손쉽게 특
정 위치로 가서 수정하지 못할 경우에는 의
심할 수 있음
하나의 클래스를 여러 개의 변경 객체로 분
리하면, 한 종류의 수정에 의해서만 변경됨
산재된 기능 (Shotgun Surgery)
수정할 때마다 여러 클래스에서 수많은 부
분을 수정해야 하는 경우
수정할 부분이 많으면 찾기 힘들고 수정해
야 하는 부분을 놓칠 수 있음
수정해야 할 부분을 하나의 클래스 안에 넣
도록 개선 필요
잘못된 소속 (Feature Envy)
어떤 메서드가 자신이 속하지 않은 클래스
에 더 많이 접근할 경우
한 메서드가 여러 클래스에 들어있는 기능
을 이용할 때도 많기 때문에 개선이 쉽지 않
음 접근하는 데이터가 가장 많은 클래스
를 선택함
데이터 뭉치 (Data Clumps)
두 클래스에 있는 인스턴스 변수나 여러 메
서드에 들어있는 매개변수처럼, 동일한 3~4
개의 데이터 항목이 여러 위치에 몰려 있는
경우엔 객체화
매개 변수가 적어져서 메서드 호출이 간결
해지고 성능이 개선될 여지도 있음
강박적 기본 타입 사용
(Primitive Obsession)
객체의 주요 장점 : 기본 타입 클래스와 응용
클래스 간의 경계를 허물 수 있음 언어에
내장된 기본 타입과 구별하기 힘든 작은 클
래스 작성이 용이
예) 자바의 wrapper 클래스, String 클래스,
Date 클래스
Switch문 (Switch Statements)
Switch문의 단점 : 반드시 중복이 생김 같
은 switch문에 새 코드 행을 추가하려면 모
든 switch문을 찾아서 수정해주어야 함
객체 지향의 “다형성”을 이용하면 switch문
을 대체할 수 있음
평행 상속 계층 (Paraled
Inheritance Hierarchies)
“산재된 기능”의 특수한 케이스
한 클래스의 하위 클래스를 만들 때마다 다
른 클래스의 하위 클래스도 만들어야 하는
경우 (서로 다른 두 상속 계층의 클래스명 접
두어가 같을 수 있음)
중복된 코드 제거를 위해서는 한 상속 계층
의 인스턴스가 다른 계층의 인스턴스를 참
조하면 됨
직무 유기 클래스 (Lazy Class)
하나의 클래스를 만들 때마다 비용이 추가
되기 때문에, 비용만큼의 기능을 수행하지
못하는 비효율적 클래스는 제거해야 함
리팩토링으로 기능이 축소된 클래스나, 쓸
모 없어진 클래스 등이 해당됨
막연한 범용 코드 (Speculative
Generality)
막연한 생각에 아직은 필요 없는 기능을 수
행하고자 온갖 호출과 case 문을 구현할 경
우, 코드를 이해하기 힘들고 유지보수가 어
려워짐
메서드나 클래스가 오직 테스트 케이스에서
만 사용될 때에도, 그것과 그것을 실행하는
테스트 케이스를 삭제해야 함
임시 필드 (Temporary Field)
어떤 객체 안에 인스턴스 변수가 특정 상황
에서만 할당되는 경우
수많은 매개변수를 전달하는 것이 번거로워
서 매개변수를 직접 필드에 대입함 이 인
스턴스 변수는 해당 알고리즘이 실행되는
동안에만 효력이 있기 때문에, 다른 경우에
는 코드를 복잡하게 만듦
메시지 체인 (Message Chain)
클라이언트가 한 객체에 제 2의 객체를 요구
하면, 제 2의 객체가 제 3의 객체를 요청하고,
제3의 객체가 제 4의 객체를 요청하는 식으
로 연쇄적 요청이 발생하는 경우
메시지가 왕래하는 체제의 관계 수정이 필
요할 경우, 클라이언트도 수정해야 함
과잉 중개 메서드 (Middle Man)
객체의 주요 특징인 “캡슐화”는 내부의 처리
를 외부에서 볼 수 없게 은폐하는데, 이때 대
부분 “위임”을 하게됨
어떤 클래스의 메서드들 중에 절반 이상의
메서드가 기능을 다른 메서드에 위임하고
있는 경우
지나친 관여 (Inapporopriate
Intimacy)
클래스 간의 관계가 지나치게 밀접하여 서
로의 private 영역까지 과도하게 접근하는
경우 엄격하고 절제된 규칙에 따라 관리
상속으로 인해 지나친 관여가 발생하는 경
우 (하위 클래스는 항상 상위 클래스가 공개
하는 것보다 많은 데이터를 필요로 함)
인터페이스가 다른 대용 클래스
(Alternative Classes with Different Interfaces)
기능은 같은데 시그니처가 다른 메서드가
존재할 경우
메서드명을 변경하거나 해당 클래스로 이동
시킬 필요 있음
미흡한 라이브러리 클래스
(Incomplete Library Class)
객체 재사용에 대한 맹신 때문에, 프로그래
머가 라이브러리 클래스에 대한 의존도가
높음
라이브러리 클래스를 원하는 기능을 수행하
게 수정하는 것은 불가능함
데이터 클래스 (Data Class)
데이터 클래스는 데이터 보관만 담당하고,
대부분의 연산은 다른 클래스가 수행하기
때문에 public 필드일 확률이 높음
캡슐화를 소홀히 한 부분에 대해서 즉각적
인 조치가 필요함
방치된 상속물 (Refused
Bequest)
상속받은 부모 클래스의 메서드와 데이터를
하위 클래스에서 더 이상 사용하지 않는 경
우
잘못된 계층구조가 원인일 수 있으나, 심각
하지 않은 경우가 대부분이라 리팩토링이
별로 필요치 않음
불필요한 주석 (Comments)
엄청난 양의 주석이 달린 코드는 코드의 잘
못된 부분을 가리기 위해 주석을 사용하는
경우가 있음
리팩토링을 통해서 주석이 존재하지 않아도
되는지 확인이 필요함
디자인 패턴
DESIGN PATTERN
디자인 패턴이란?
GoF : the Gang of Four
Erich Gamma, Richard Helm, Ralph Johnson, John
Vlissides 등 4명의 개발자(과학 연구자?)
Design Pattern
GoF가 정리한 개발자의 ‘경험’이나 ‘내적인 축적’
디자인 패턴 정의
프로그램 개발에서 자주 나타나는 과제를
해결하기 위한 방법 중 하나
과거의 소프트웨어 개발 과정에서 발견된
설계의 노하우를 축적하여 이름을 붙이고
이후에 재이용하기 좋은 형태로 특정의 규
약을 묶어서 정리한 것
디자인 패턴 정의
알고리즘과 같이 프로그램 코드로 바로 변
환될 수 있는 형태는 아니지만, 특정한 상황
에서 구조적인 문제를 해결하는 방식을 설
명해줌
디자인 패턴 개념
“디자인 패턴” != “클래스 라이브러리”
클래스 라이브러리보다 더 일반적인 개념
클래스 라이브러리 = 부품이 되는 프로그램
디자인 패턴 = 부품이 어떻게 조립되어 있고,
각각의 부품이 어떻게 관련해서 큰 기능을
발휘하는지를 표현
클래스 라이브러리 안에서 디자
인 패턴이 사용된다
Java의 표준적인 클래스 라이브러리 안에는
디자인 패턴이 많이 활용 됨
디자인 패턴을 이용하고 있으면 클래스 라
이브러리의 역할을 이해하는데 도움이 됨
프로그램은 완성품이 아니다
디자인 패턴의 목표 중 하나는 프로그램의
재이용을 가능케 하는 것
프로그램을 어떻게 “부품”으로써 재이용할
수 있는가?
프로그램을 ‘완성품’이 아니라 앞으로 ‘기능
을 확장해 가는 것’, ‘변경할 수 있는 것’임
디자인 패턴에서의 “역할”
디자인 패턴마다 클래스나 인터페이스에 각
자의 역할이 주어짐 역할을 이해하지 못
하면 전체의 패턴을 이해할 수 없음
동일한 패턴이라면 클래스 이름이 다르더라
도 클래스에 상응하는 역할이 주어짐
디자인 패턴 적용 규칙
구현 클래스가 아니라 인터페이스를 가지고
프로그래밍한다
인터페이스를 바탕으로 하는 클래스 호출
상속(Inheritance)이 아니라 Delegation을 사
용한다
delegation을 통해 런타임의 행위를 변경
의존도(Coupling)를 최소화함으로써 추후의
변화를 국부화한다
디자인 패턴 종류
Iterator – 순서대로 지정해서 처리하기
Adapter – 바꿔서 재이용하기
Template Method – 하위 클래스에서 구체적
으로 처리하기
Factory Method – 하위 클래스에서 인스턴
스 만들기
Singleton – 인스턴스를 한 개만 만들기
Prototype – 복사해서 인스턴스 만들기
디자인 패턴 종류
Builder – 복잡한 인스턴스 조립하기
Abstract Factory - 관련 부품을 조합해서 제
품 만들기
Bridge – 기능 계층과 구현 계층 분리하기
Strategy – 알고리즘을 모두 바꾸기
Composite – 그릇과 내용물을 동일시 하기
Decorator – 장식과 내용물을 동일시하기
Visitor – 데이터 구조를 돌아다니면서 처리
하기
디자인 패턴 종류
Chain of Responsibility – 책임 떠넘기기
Façade – 단순한 창구
Mediator – 중개인을 통해서 처리하기
Observer – 상태의 변화를 알려주기
Memento – 상태를 저장하기
State – 상태를 클래스로 표현하기
Flyweight – 동일한 것을 공유해서 낭비 없애
기
디자인 패턴 종류
Proxy – 필요해지면 만들기
Command – 명령을 클래스로 하기
Interpreter – 문법 규칙을 클래스로 표현하
기