SlideShare a Scribd company logo
디자인 패턴
데브루키 스터디 노대영
주제 선정 이유
• 개발 간 의사소통을 더 편하게 하기 위해서
• 잘 돌아가면 장땡?
• 구조가 잘 잡힌 프로그래밍을 해보자.
• 객체지향 프로그래밍의 원칙 알아보기.
참고 서적
객체지향 디자인 원칙 (Solid)
• S - SRP(Single responsibility principle) 단일 책임 원칙
• O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙
• L - LSP(Liskov Substitusion Principle) 리스코프 치환 법칙
• I - ISP(Interface Segregation Principle) 인터페이스 분리 원
칙
• D - DIP(Dependency Inversion Principle) 의존성 역전 법칙
객체지향 디자인 원칙 (Solid)
• S - SRP(Single responsibility principle) 단일 책임 원칙
• 객체에 단 하나의 책임만을 가져야한다.
• 객체에 많은 기능과 책임을 정의하면 변경 시 많은 부분
을
변경할 수도 있고, 의도치 않은 곳에 오류가 생기기 쉽다.
• 응집도가 높은 클래스를 만들어야한다.
객체지향 디자인 원칙 (Solid)
• O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙
• 기존의 코드를 변경하지 않으면서 기능을 추가 할 수 있
도록
설계 되어야한다.
• 모듈은 추상화 된 클래스의 의존하여, 가능한 동작을 수
행하게
설계 해야함.
객체지향 디자인 원칙 (Solid)
• L - LSP(Liskov Substitusion Principle) 리스코프 치환 법칙
• 파생 클래스는 부모 클래스의 가능한 행위는 수행할 수
있어야
한다.
• 부모 클래스에 의해 파생 클래스의 행동이 추상화 되어,
소스코드에 존재할텐데 추상화 된 내용을 수행을 못 하
면
부모 클래스에서 상속 받는 메소드들이 잘못 설계가 되
어진것
객체지향 디자인 원칙 (Solid)
• I - ISP(Interface Segregation Principle) 인터페이스 분리 원
칙
• 클라이언트 자신이 이용하지 않는 기능에는 영향을 받지
않아야
한다.
• 큰 덩어리의 인터페이스가 아닌 작은 인터페이스로 분리
하여
의존성을 약화 시켜 유연한 구조로 설계한다.
객체지향 디자인 원칙 (Solid)
• D - DIP(Dependency Inversion Principle) 의존성 역전 법칙
• 변화가 없는 것에 의존 하라. 고수준 요소가 저수준 요소
의
추상 클래스에 의존하게 설계 해야함.
• 고수준 요소가 저수준의 구상 클래스에 의존하게 되면
고수준 요소가 저수준의 요소에 의존하게 된다.
• 의존성 역전은 전통적 방식에 하이레벨에서 로우레벨을
의존하는 방식을 역전 시켜 설계하는 것을 지향.
디자인 패턴 소스코드
• 해당 디자인 패턴 소스코드는 Git에 업로드 했습니다.
https://github.com/PAndy92/StudyOfProgramming
• Java -> C#으로 작성한 코드입니다.
• 문의는 ndy192@gmail.com 이나 코멘트
달아주시면 감사하겠습니다.
1. Stragey Pattern
Stragey Pattern은
알고리즘군을 정의하고
각각을 캡슐화하여 교환해서
사용할 수 있도록 만든다.
1. Stragey Pattern
인간 캐릭터에
순간이동 시스템을 추가 해주세요~
.398class Human
{
virtual protected void Display()
{
// 화면표시
}
protected void Walk()
{
// 걷기
}
}
class Fighter : Human
{
override protected void Display()
{
base.Display();
}
}
class NPC : Human
{
override protected void Display()
{
base.Display();
}
}
1. Stragey Pattern
캐릭터들이 상속 받는 Human Class에
Teleport를 추가하면 끝!?
NPC 들이 마을에서 사라져버렸어요!!
1. Stragey Pattern
상속 대신 인터페이스를 사용해?보는건 어떨까요?
더 나아졌나요?
규격 변경 시 서브 클래스의 인터페이스 메소드들을
변경해줘야하는 문제가 아직 있음.(재사용성 떨어짐)
달라지는 부분과 달리지지 않는 부분으로 분리를 해봅시다.
1. Stragey Pattern
구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
서브클래스에 직접 구현이 아닌 행동클래스에 구현함으로
유연성과 재사용성 증대
1. Stragey Pattern
Human 클래스 리모델링
.398class Human
{
private AttackBehavior attackBehavior;
private TeleportBehavior teleportBehavior;
virtual protected void Display()
{
// 화면표시
}
public void Walk()
{
// 걷기
}
public void PerformTeleport()
{
teleportBehavior.Teleport();
}
public void PerformAttack()
{
attackBehavior.Attack();
}
}
2. Observer Pattern
Observer Pattern은
객체의 상태가 바뀌면 그 객체에 의존하는
다른 객체들한테 연락이 가고 자동으로 내용이 갱신되
는 방식
일대다 의존성을 정의합니다.
2. Observer Pattern
게임 시간 변화에 따라
게임 룰, UI 등의 정보가 변경됩니다.
게임 시간 변화 뿐만
아니라 플레이어 수도 영향이
가게 변경해주세요.
2. Observer Pattern
변화 주체가 관찰자를
자세히 알아야할 필요가 있을까요?
서로 상호작용을 하는 객체 사이에서는
가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
2. Observer Pattern
서로의 결합을 줄여 봅시다!
(디커플링 커플은 사악합니다 여러분!)
2. Observer Pattern
변화 주체에게 상태 변화 시
통지를 부탁한다.
2. Observer Pattern
변화 주체에게 상태 변화 시
통지를 부탁한다.
3. Decorator Pattern
객체에 추가적인 요건을 동적으로 첨가한다.
데코레이터는 서브클래스를 만드는 것을 통해서
기능을 유연하게 확장할 수 있는 방법을 제공한다.
3. Decorator Pattern
모든 판매 아이템은
Beverage 클래스를 상속 받아서 사용하고 있군요
3. Decorator Pattern
현재 서비스하고 있는 커피 제조 시스템인데
좀 더 유저들이 높은 자유도를 느낄 수 있게
변경하고 싶습니다~
3. Decorator Pattern
하나하나 클래스를 만들겠다고요?
미쳤나요?
3. Decorator Pattern
그럼 시스템을 처음 부터 다시 만들겠어요!
3. Decorator Pattern
클래스는 확장에 대해서는 열려 있어야
하지만 코드 변경에 대해서는 닫혀 있어야한다.(OCP)
3. Decorator Pattern
뭔가 복잡해진거 같은데?
3. Decorator Pattern
getCost() getCost() getCost()
ColdBrew
Mocha
Soy
모카 두유가 첨가된 콜드 브루가 만들어졌습니다!
4. Factory Method Pattern
팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데,
어떤 클래스의 인스턴스를 만들어지는 서브클래스에서 결정하게 만듭니다.
팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡김.
4. Factory Method Pattern
피자 타이쿤 게임을 만들어 봅시다.
가게 마다 제조할 수 있는 피자는
달라질 수 있어요.
4. Factory Method Pattern
피자의 종류는
계속 추가, 변경 될 수
있습니다.
피자
치즈
피자
불고기
피자
야채
피자
4. Factory Method Pattern
피자 가게 종류 마다
다른 피자 조제법이 필요합니다.
A피자
치즈
피자
불고기
피자
야채
피자
B피자
소시지
피자
고구마
피자
치킨
피자
4. Factory Method Pattern
구현된 객체를 다 알야하는
문제가 생김.(의존성이 커짐)
4. Factory Method Pattern
추상화된 것에 의존하도록 만들어라.
구성 클래스에 의존하도록 만들지 않도록 한다.(DIP)
5. Singleton Pattern
싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고,
어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴입니다.
5. Singleton Pattern
1. 객체 접근성이 편해짐
2. 객체 생성 순서에 자유로움
3. 매니저나 설정 내용이 두개의
객체가 필요한가?
6. Command Pattern
요청 내역을 객체로 캡슐화하여
클라이언트를 서로 다른 요청 내역에따라 매개변수화 할 수 있습니다.
요청을 리스트업 하거나 작업취소 기능을 지원할 수 도 있습니다.
6. Command Pattern
직접 구현된 클래스가 아닌
인터페이스를 이용하여
6. Command Pattern
실행 취소 등 기능을
구현하기에 적합한 디자인 패턴.
7. Templete Method Pattern
메소드에서 알고리즘의 골격을 정의합니다.
알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있습니다.
템플릿 메소드를 이용하면 알고리즘의 구조를 그대로 유지하며
서브클래스에서 특정 단계를 재정의 할 수 있습니다.
7. Templete Method Pattern
먼저 연락하지마세요.
필요할 때 불러드리겠습니다.
7. Templete Method Pattern
Monster 정렬?
int string Monster
List.
Sort
8. Iterator Pattern
컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체
안에 들어있는 모든 항목에 접근할 수 있게
해주는 방법을 제공해 줍니다.
8. Iterator Pattern
다양한 컬렉션을 받아서
순회 하는 로직을 짜야합니다.
어떻게 짜야 효율 적일까요?
Printer
Dictiona
ry
Array
List
8 + . Composite Pattern
객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로
만들 수 있습니다. 이 패턴을 이용하면 클라이언트에서
개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있습니다.
9. State Pattern
객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있습니다.
마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있습니다.
9. State Pattern
동전
있음
동전
없음
껌
판매
껌
매진
동전 투입
동전 반환
손잡이 돌림
껌 반환
껌 = 0
껌 > 0
만들어 봅시다!
9. State Pattern
동전
있음
동전
없음
껌
판매
껌
매진
동전 투입
동전 반환
손잡이 돌림
껌 반환
껌 = 0
껌 > 0
껌 일정 확률로 두개 나가게 해주세요!
9. State Pattern
동전
있음
동전
없음
껌
판매
껌
매진
동전 투입
동전 반환
손잡이 돌림
껌 반환
껌 = 0
껌 > 0
껌 일정 확률로 두개 나가게 해주세요!
9. State Pattern
각 상태의 행동을 정의해서 사용!
변경을 피하고 확장에 유연해 질수 있음.
QA
감사합니다.

More Related Content

What's hot

프로그래밍 방식의 변천 과정
프로그래밍 방식의 변천 과정프로그래밍 방식의 변천 과정
프로그래밍 방식의 변천 과정
중선 곽
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
중선 곽
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
유리 하
 
읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다
wonmin lee
 
OOP SOLID PRINCIPLE(KOREAN)
OOP SOLID PRINCIPLE(KOREAN)OOP SOLID PRINCIPLE(KOREAN)
OOP SOLID PRINCIPLE(KOREAN)
Daeyeon Kim
 
Scala trait usage
Scala trait usageScala trait usage
Scala trait usage
Yong Joon Moon
 
자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)
중선 곽
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)
Seung-June Lee
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴
Sungchul Park
 
C++ 2학기 수행평가
C++ 2학기 수행평가C++ 2학기 수행평가
C++ 2학기 수행평가
Jaehee Lee
 
Spring di chapter1
Spring di chapter1Spring di chapter1
Spring di chapter1
흥래 김
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Dong Chan Shin
 
Oop (객체지향이란)?
Oop (객체지향이란)?Oop (객체지향이란)?
Oop (객체지향이란)?
철운 장
 
Scala self type inheritance
Scala self type inheritanceScala self type inheritance
Scala self type inheritance
Yong Joon Moon
 
20 handler and_async_task
20 handler and_async_task20 handler and_async_task
20 handler and_async_task운용 최
 
Swift extensions
Swift extensionsSwift extensions
Swift extensions
wileychoi
 
OOP - Object Oriendted Programing
OOP - Object Oriendted ProgramingOOP - Object Oriendted Programing
OOP - Object Oriendted Programing
ChangHyeon Bae
 
객체지향 프로그래밍 기본
객체지향 프로그래밍 기본객체지향 프로그래밍 기본
객체지향 프로그래밍 기본
용호 최
 

What's hot (18)

프로그래밍 방식의 변천 과정
프로그래밍 방식의 변천 과정프로그래밍 방식의 변천 과정
프로그래밍 방식의 변천 과정
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다
 
OOP SOLID PRINCIPLE(KOREAN)
OOP SOLID PRINCIPLE(KOREAN)OOP SOLID PRINCIPLE(KOREAN)
OOP SOLID PRINCIPLE(KOREAN)
 
Scala trait usage
Scala trait usageScala trait usage
Scala trait usage
 
자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴
 
C++ 2학기 수행평가
C++ 2학기 수행평가C++ 2학기 수행평가
C++ 2학기 수행평가
 
Spring di chapter1
Spring di chapter1Spring di chapter1
Spring di chapter1
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬
 
Oop (객체지향이란)?
Oop (객체지향이란)?Oop (객체지향이란)?
Oop (객체지향이란)?
 
Scala self type inheritance
Scala self type inheritanceScala self type inheritance
Scala self type inheritance
 
20 handler and_async_task
20 handler and_async_task20 handler and_async_task
20 handler and_async_task
 
Swift extensions
Swift extensionsSwift extensions
Swift extensions
 
OOP - Object Oriendted Programing
OOP - Object Oriendted ProgramingOOP - Object Oriendted Programing
OOP - Object Oriendted Programing
 
객체지향 프로그래밍 기본
객체지향 프로그래밍 기본객체지향 프로그래밍 기본
객체지향 프로그래밍 기본
 

Similar to [Dev rookie]designpattern

디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
Shin heemin
 
3팀_객체지향 프로그래밍.pptx
3팀_객체지향 프로그래밍.pptx3팀_객체지향 프로그래밍.pptx
3팀_객체지향 프로그래밍.pptx
ssuser642b19
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Daum DNA
 
Design patterns
Design patternsDesign patterns
Design patterns
Joshua Yoon
 
Effective java
Effective javaEffective java
Effective java
Haeil Yi
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2
Minseok Jang
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2SeungHyun Hwang
 
몽고디비교육1일차
몽고디비교육1일차몽고디비교육1일차
몽고디비교육1일차
seung-hyun Park
 
[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계
AnselmKim
 
디자인패턴
디자인패턴디자인패턴
디자인패턴
진화 손
 
C Language II
C Language IIC Language II
C Language IISuho Kwon
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
Injae Lee
 
The Introduction to Refactoring
The Introduction to Refactoring The Introduction to Refactoring
The Introduction to Refactoring
김진태 Jintae Kim
 
객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx
ssuser9eebcf
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
AnselmKim
 
분석과 설계
분석과 설계분석과 설계
분석과 설계
Haeil Yi
 
Object-Oriented Programming.pptx
 Object-Oriented Programming.pptx Object-Oriented Programming.pptx
Object-Oriented Programming.pptx
ssuserda17f6
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DI
JU Chae
 
객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx
Park Doil
 
4팀_객체지향 프로그래밍.pptx
4팀_객체지향 프로그래밍.pptx4팀_객체지향 프로그래밍.pptx
4팀_객체지향 프로그래밍.pptx
ssuser40c239
 

Similar to [Dev rookie]designpattern (20)

디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
3팀_객체지향 프로그래밍.pptx
3팀_객체지향 프로그래밍.pptx3팀_객체지향 프로그래밍.pptx
3팀_객체지향 프로그래밍.pptx
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Effective java
Effective javaEffective java
Effective java
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2
 
몽고디비교육1일차
몽고디비교육1일차몽고디비교육1일차
몽고디비교육1일차
 
[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계
 
디자인패턴
디자인패턴디자인패턴
디자인패턴
 
C Language II
C Language IIC Language II
C Language II
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
The Introduction to Refactoring
The Introduction to Refactoring The Introduction to Refactoring
The Introduction to Refactoring
 
객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
 
분석과 설계
분석과 설계분석과 설계
분석과 설계
 
Object-Oriented Programming.pptx
 Object-Oriented Programming.pptx Object-Oriented Programming.pptx
Object-Oriented Programming.pptx
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DI
 
객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx객체지향 프로그래밍.pptx
객체지향 프로그래밍.pptx
 
4팀_객체지향 프로그래밍.pptx
4팀_객체지향 프로그래밍.pptx4팀_객체지향 프로그래밍.pptx
4팀_객체지향 프로그래밍.pptx
 

More from 대영 노

Dev rookie codecomplete-1
Dev rookie codecomplete-1Dev rookie codecomplete-1
Dev rookie codecomplete-1
대영 노
 
Unrealjs
UnrealjsUnrealjs
Unrealjs
대영 노
 
Google c++codingconvention
Google c++codingconventionGoogle c++codingconvention
Google c++codingconvention
대영 노
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box
대영 노
 
Start unreal
Start unrealStart unreal
Start unreal
대영 노
 
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
대영 노
 
[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디
대영 노
 

More from 대영 노 (7)

Dev rookie codecomplete-1
Dev rookie codecomplete-1Dev rookie codecomplete-1
Dev rookie codecomplete-1
 
Unrealjs
UnrealjsUnrealjs
Unrealjs
 
Google c++codingconvention
Google c++codingconventionGoogle c++codingconvention
Google c++codingconvention
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box
 
Start unreal
Start unrealStart unreal
Start unreal
 
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
 
[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디[데브루키]노대영_알고리즘 스터디
[데브루키]노대영_알고리즘 스터디
 

[Dev rookie]designpattern

  • 2. 주제 선정 이유 • 개발 간 의사소통을 더 편하게 하기 위해서 • 잘 돌아가면 장땡? • 구조가 잘 잡힌 프로그래밍을 해보자. • 객체지향 프로그래밍의 원칙 알아보기.
  • 4. 객체지향 디자인 원칙 (Solid) • S - SRP(Single responsibility principle) 단일 책임 원칙 • O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙 • L - LSP(Liskov Substitusion Principle) 리스코프 치환 법칙 • I - ISP(Interface Segregation Principle) 인터페이스 분리 원 칙 • D - DIP(Dependency Inversion Principle) 의존성 역전 법칙
  • 5. 객체지향 디자인 원칙 (Solid) • S - SRP(Single responsibility principle) 단일 책임 원칙 • 객체에 단 하나의 책임만을 가져야한다. • 객체에 많은 기능과 책임을 정의하면 변경 시 많은 부분 을 변경할 수도 있고, 의도치 않은 곳에 오류가 생기기 쉽다. • 응집도가 높은 클래스를 만들어야한다.
  • 6. 객체지향 디자인 원칙 (Solid) • O - OCP(Open Closed Principle) 개방 - 폐쇄 원칙 • 기존의 코드를 변경하지 않으면서 기능을 추가 할 수 있 도록 설계 되어야한다. • 모듈은 추상화 된 클래스의 의존하여, 가능한 동작을 수 행하게 설계 해야함.
  • 7. 객체지향 디자인 원칙 (Solid) • L - LSP(Liskov Substitusion Principle) 리스코프 치환 법칙 • 파생 클래스는 부모 클래스의 가능한 행위는 수행할 수 있어야 한다. • 부모 클래스에 의해 파생 클래스의 행동이 추상화 되어, 소스코드에 존재할텐데 추상화 된 내용을 수행을 못 하 면 부모 클래스에서 상속 받는 메소드들이 잘못 설계가 되 어진것
  • 8. 객체지향 디자인 원칙 (Solid) • I - ISP(Interface Segregation Principle) 인터페이스 분리 원 칙 • 클라이언트 자신이 이용하지 않는 기능에는 영향을 받지 않아야 한다. • 큰 덩어리의 인터페이스가 아닌 작은 인터페이스로 분리 하여 의존성을 약화 시켜 유연한 구조로 설계한다.
  • 9. 객체지향 디자인 원칙 (Solid) • D - DIP(Dependency Inversion Principle) 의존성 역전 법칙 • 변화가 없는 것에 의존 하라. 고수준 요소가 저수준 요소 의 추상 클래스에 의존하게 설계 해야함. • 고수준 요소가 저수준의 구상 클래스에 의존하게 되면 고수준 요소가 저수준의 요소에 의존하게 된다. • 의존성 역전은 전통적 방식에 하이레벨에서 로우레벨을 의존하는 방식을 역전 시켜 설계하는 것을 지향.
  • 10. 디자인 패턴 소스코드 • 해당 디자인 패턴 소스코드는 Git에 업로드 했습니다. https://github.com/PAndy92/StudyOfProgramming • Java -> C#으로 작성한 코드입니다. • 문의는 ndy192@gmail.com 이나 코멘트 달아주시면 감사하겠습니다.
  • 11. 1. Stragey Pattern Stragey Pattern은 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.
  • 12. 1. Stragey Pattern 인간 캐릭터에 순간이동 시스템을 추가 해주세요~ .398class Human { virtual protected void Display() { // 화면표시 } protected void Walk() { // 걷기 } } class Fighter : Human { override protected void Display() { base.Display(); } } class NPC : Human { override protected void Display() { base.Display(); } }
  • 13. 1. Stragey Pattern 캐릭터들이 상속 받는 Human Class에 Teleport를 추가하면 끝!? NPC 들이 마을에서 사라져버렸어요!!
  • 14. 1. Stragey Pattern 상속 대신 인터페이스를 사용해?보는건 어떨까요? 더 나아졌나요? 규격 변경 시 서브 클래스의 인터페이스 메소드들을 변경해줘야하는 문제가 아직 있음.(재사용성 떨어짐) 달라지는 부분과 달리지지 않는 부분으로 분리를 해봅시다.
  • 15. 1. Stragey Pattern 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다. 서브클래스에 직접 구현이 아닌 행동클래스에 구현함으로 유연성과 재사용성 증대
  • 16. 1. Stragey Pattern Human 클래스 리모델링 .398class Human { private AttackBehavior attackBehavior; private TeleportBehavior teleportBehavior; virtual protected void Display() { // 화면표시 } public void Walk() { // 걷기 } public void PerformTeleport() { teleportBehavior.Teleport(); } public void PerformAttack() { attackBehavior.Attack(); } }
  • 17. 2. Observer Pattern Observer Pattern은 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되 는 방식 일대다 의존성을 정의합니다.
  • 18. 2. Observer Pattern 게임 시간 변화에 따라 게임 룰, UI 등의 정보가 변경됩니다. 게임 시간 변화 뿐만 아니라 플레이어 수도 영향이 가게 변경해주세요.
  • 19. 2. Observer Pattern 변화 주체가 관찰자를 자세히 알아야할 필요가 있을까요? 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
  • 20. 2. Observer Pattern 서로의 결합을 줄여 봅시다! (디커플링 커플은 사악합니다 여러분!)
  • 21. 2. Observer Pattern 변화 주체에게 상태 변화 시 통지를 부탁한다.
  • 22. 2. Observer Pattern 변화 주체에게 상태 변화 시 통지를 부탁한다.
  • 23. 3. Decorator Pattern 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.
  • 24. 3. Decorator Pattern 모든 판매 아이템은 Beverage 클래스를 상속 받아서 사용하고 있군요
  • 25. 3. Decorator Pattern 현재 서비스하고 있는 커피 제조 시스템인데 좀 더 유저들이 높은 자유도를 느낄 수 있게 변경하고 싶습니다~
  • 26. 3. Decorator Pattern 하나하나 클래스를 만들겠다고요? 미쳤나요?
  • 27. 3. Decorator Pattern 그럼 시스템을 처음 부터 다시 만들겠어요!
  • 28. 3. Decorator Pattern 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야한다.(OCP)
  • 29. 3. Decorator Pattern 뭔가 복잡해진거 같은데?
  • 30. 3. Decorator Pattern getCost() getCost() getCost() ColdBrew Mocha Soy 모카 두유가 첨가된 콜드 브루가 만들어졌습니다!
  • 31. 4. Factory Method Pattern 팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들어지는 서브클래스에서 결정하게 만듭니다. 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡김.
  • 32. 4. Factory Method Pattern 피자 타이쿤 게임을 만들어 봅시다. 가게 마다 제조할 수 있는 피자는 달라질 수 있어요.
  • 33. 4. Factory Method Pattern 피자의 종류는 계속 추가, 변경 될 수 있습니다. 피자 치즈 피자 불고기 피자 야채 피자
  • 34. 4. Factory Method Pattern 피자 가게 종류 마다 다른 피자 조제법이 필요합니다. A피자 치즈 피자 불고기 피자 야채 피자 B피자 소시지 피자 고구마 피자 치킨 피자
  • 35. 4. Factory Method Pattern 구현된 객체를 다 알야하는 문제가 생김.(의존성이 커짐)
  • 36. 4. Factory Method Pattern 추상화된 것에 의존하도록 만들어라. 구성 클래스에 의존하도록 만들지 않도록 한다.(DIP)
  • 37. 5. Singleton Pattern 싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴입니다.
  • 38. 5. Singleton Pattern 1. 객체 접근성이 편해짐 2. 객체 생성 순서에 자유로움 3. 매니저나 설정 내용이 두개의 객체가 필요한가?
  • 39. 6. Command Pattern 요청 내역을 객체로 캡슐화하여 클라이언트를 서로 다른 요청 내역에따라 매개변수화 할 수 있습니다. 요청을 리스트업 하거나 작업취소 기능을 지원할 수 도 있습니다.
  • 40. 6. Command Pattern 직접 구현된 클래스가 아닌 인터페이스를 이용하여
  • 41. 6. Command Pattern 실행 취소 등 기능을 구현하기에 적합한 디자인 패턴.
  • 42. 7. Templete Method Pattern 메소드에서 알고리즘의 골격을 정의합니다. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있습니다. 템플릿 메소드를 이용하면 알고리즘의 구조를 그대로 유지하며 서브클래스에서 특정 단계를 재정의 할 수 있습니다.
  • 43. 7. Templete Method Pattern 먼저 연락하지마세요. 필요할 때 불러드리겠습니다.
  • 44. 7. Templete Method Pattern Monster 정렬? int string Monster List. Sort
  • 45. 8. Iterator Pattern 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공해 줍니다.
  • 46. 8. Iterator Pattern 다양한 컬렉션을 받아서 순회 하는 로직을 짜야합니다. 어떻게 짜야 효율 적일까요? Printer Dictiona ry Array List
  • 47. 8 + . Composite Pattern 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있습니다. 이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합 객체를 똑같은 방법으로 다룰 수 있습니다.
  • 48. 9. State Pattern 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있습니다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있습니다.
  • 49. 9. State Pattern 동전 있음 동전 없음 껌 판매 껌 매진 동전 투입 동전 반환 손잡이 돌림 껌 반환 껌 = 0 껌 > 0 만들어 봅시다!
  • 50. 9. State Pattern 동전 있음 동전 없음 껌 판매 껌 매진 동전 투입 동전 반환 손잡이 돌림 껌 반환 껌 = 0 껌 > 0 껌 일정 확률로 두개 나가게 해주세요!
  • 51. 9. State Pattern 동전 있음 동전 없음 껌 판매 껌 매진 동전 투입 동전 반환 손잡이 돌림 껌 반환 껌 = 0 껌 > 0 껌 일정 확률로 두개 나가게 해주세요!
  • 52. 9. State Pattern 각 상태의 행동을 정의해서 사용! 변경을 피하고 확장에 유연해 질수 있음.
  • 53. QA