2. 인터페이스로 프로그래밍하기         그리고    몇 개의 생성패턴 (1/2)   발표자 : 카즈머스(신용철)
클래스 vs 인터페이스Extends                   Implements              다형성              유연성          응집도(anti-결합도)            항상성(안...
Implements 의 전략• 상속 대신 캡슐화   – 필드로 갖고 은닉하기
Extends 용도• 동일 코드 반복 구현 회피
Gof 디자인패턴의 핵심• 구현 상속(extends)을 인터  페이스 상속(implements)으  로 바꾸는 방법
객체지향의 핵심• 다형성  – 동일한 타입에 다양한 구현 제공• 데이터 추상화  – 객체 안에 캡슐화
1     유연성 상실• 애자일 개발 방법론  – 디자인과 개발을 병행  – 변화에 대한 유연한 대응 필요
1. 유연성 상실void f(){  LinkedList list = new LinkedList();  //...  modify( list );}void modify( LinkedList list ){  list.add(...
1. 유연성 상실void f(){  Collection list = new LinkedList();  //...  modify( list );}void modify( Collection list ){  list.add(...
1. 유연성 상실void f(){  Collection c = new HashSet();  //...  examine( c );}void examine( Collection c ){  for( Iterator i = c...
1. 유연성 상실void f(){  Collection c = new HashSet();  //...  examine( c.iterator() );}void examine( Iterator i ){  for(; i.ha...
2          결합도 증가    • 결합도 높으면 유지보수 곤란      – 한 곳의 수정 나비효과    • getter/setter = public
3    깨지기 쉬운 기반 클래스• extends 사용시 파생클래스와  기반클래스의 강한 결합  – 기반클래스 수정 파생 클  래스오작동
3. 약골 기반class Stack extends ArrayList {   private int topOfStack = 0;   public void push( Object article ) {        add( t...
3. 약골 기반                                                             해결책 - 캡슐화class Stack {    private int topOfStack = 0;...
4      다중 상속• 다중 상속이 유용한 경우  – 한 객체가 이것이면서    저것일 필요가 있을 때
4. 다중 상속interface Base {   void f();   static class Implementation implements Base {         public void f() { /*...*/ }  ...
5         프레임워크    • 상속 기반의 아키텍처     – Template Method 패턴     – 깨지기도 쉽고     – 구현할 클래스가 너무 많다.    • out of the box     – 합성...
Factory Method 패턴 • 자바 스윙의 예  – 가상의 요구 사항이라는 함정  – 유연성 위해 필요 이상으로 복잡  – 패턴의 광신도 지양하자. • 구현상속으로 객체 생성 제어  – 기반 클래스 확장도 없어서 ...
Extends의 용도 - 다시 • 정규화  – 공통 연산 기반클래스에 집중 • 한 클래스가 다른 클래스에 약간   의 연산을 추가 • 상속 구조의 Keypoint  – 연산이 공유되는가? • 컴파일 타임 타입 검사
Upcoming SlideShare
Loading in …5
×

실용주의 디자인패턴 2 인터페이스로 프로그래밍하기

1,927 views
1,734 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,927
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
20
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

실용주의 디자인패턴 2 인터페이스로 프로그래밍하기

  1. 1. 2. 인터페이스로 프로그래밍하기 그리고 몇 개의 생성패턴 (1/2) 발표자 : 카즈머스(신용철)
  2. 2. 클래스 vs 인터페이스Extends Implements 다형성 유연성 응집도(anti-결합도) 항상성(안전성) 단순도 구현 용이
  3. 3. Implements 의 전략• 상속 대신 캡슐화 – 필드로 갖고 은닉하기
  4. 4. Extends 용도• 동일 코드 반복 구현 회피
  5. 5. Gof 디자인패턴의 핵심• 구현 상속(extends)을 인터 페이스 상속(implements)으 로 바꾸는 방법
  6. 6. 객체지향의 핵심• 다형성 – 동일한 타입에 다양한 구현 제공• 데이터 추상화 – 객체 안에 캡슐화
  7. 7. 1 유연성 상실• 애자일 개발 방법론 – 디자인과 개발을 병행 – 변화에 대한 유연한 대응 필요
  8. 8. 1. 유연성 상실void f(){ LinkedList list = new LinkedList(); //... modify( list );}void modify( LinkedList list ){ list.add( ... ); doSomethingWith( list );}
  9. 9. 1. 유연성 상실void f(){ Collection list = new LinkedList(); //... modify( list );}void modify( Collection list ){ list.add( ... ); doSomethingWith( list );}
  10. 10. 1. 유연성 상실void f(){ Collection c = new HashSet(); //... examine( c );}void examine( Collection c ){ for( Iterator i = c.iterator(); i.hasNext() ;) //...}
  11. 11. 1. 유연성 상실void f(){ Collection c = new HashSet(); //... examine( c.iterator() );}void examine( Iterator i ){ for(; i.hasNext() ; i.next() ) //...}
  12. 12. 2 결합도 증가 • 결합도 높으면 유지보수 곤란 – 한 곳의 수정 나비효과 • getter/setter = public
  13. 13. 3 깨지기 쉬운 기반 클래스• extends 사용시 파생클래스와 기반클래스의 강한 결합 – 기반클래스 수정 파생 클 래스오작동
  14. 14. 3. 약골 기반class Stack extends ArrayList { private int topOfStack = 0; public void push( Object article ) { add( topOfStack++, article ); } public Object pop() { return remove( --topOfStack ); } public void pushMany( Object[] articles ) { for( int i = 0; i < articles.length; ++i ) push( articles[i] ); } Stack aStack = new Stack();} aStack.push("1"); aStack.push("2"); aStack.clear();
  15. 15. 3. 약골 기반 해결책 - 캡슐화class Stack { private int topOfStack = 0; private ArrayList theData = new ArrayList(); public void push( Object article ) { theData.add( topOfStack++, article ); } public Object pop() { return theData.remove( --topOfStack ); } public void pushMany( Object[] articles ) { for( int i = 0; i < articles.length; ++i ) push( articles[i] ); } public int size() { // current stack size. return theData.size(); }}
  16. 16. 4 다중 상속• 다중 상속이 유용한 경우 – 한 객체가 이것이면서 저것일 필요가 있을 때
  17. 17. 4. 다중 상속interface Base { void f(); static class Implementation implements Base { public void f() { /*...*/ } }}// Something과 Base.Implementation 를 동시에 상속class Derived extends Something implements Base { Base delegate = new Base.Implementation(); public void f() { delegate.f(); }}
  18. 18. 5 프레임워크 • 상속 기반의 아키텍처 – Template Method 패턴 – 깨지기도 쉽고 – 구현할 클래스가 너무 많다. • out of the box – 합성을 통해 그대로 가져다 쓸 수 있게 해야
  19. 19. Factory Method 패턴 • 자바 스윙의 예 – 가상의 요구 사항이라는 함정 – 유연성 위해 필요 이상으로 복잡 – 패턴의 광신도 지양하자. • 구현상속으로 객체 생성 제어 – 기반 클래스 확장도 없어서 extends를 잘못 사용하는 예
  20. 20. Extends의 용도 - 다시 • 정규화 – 공통 연산 기반클래스에 집중 • 한 클래스가 다른 클래스에 약간 의 연산을 추가 • 상속 구조의 Keypoint – 연산이 공유되는가? • 컴파일 타임 타입 검사

×