SlideShare a Scribd company logo
1 of 20
Download to read offline
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( ... );
  doSomethingWith( list );
}
1. 유연성 상실

void f()
{
  Collection list = new LinkedList();
  //...
  modify( list );
}

void modify( Collection list )
{
  list.add( ... );
  doSomethingWith( list );
}
1. 유연성 상실

void f()
{
  Collection c = new HashSet();
  //...
  examine( c );
}

void examine( Collection c )
{
  for( Iterator i = c.iterator(); i.hasNext() ;)
  //...
}
1. 유연성 상실

void f()
{
  Collection c = new HashSet();
  //...
  examine( c.iterator() );
}

void examine( Iterator i )
{
  for(; i.hasNext() ; i.next() )
  //...
}
2
          결합도 증가

    • 결합도 높으면 유지보수 곤란
      – 한 곳의 수정 나비효과
    • getter/setter = public
3
    깨지기 쉬운 기반 클래스
• extends 사용시 파생클래스와
  기반클래스의 강한 결합
  – 기반클래스 수정 파생 클
  래스오작동
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();
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();
    }
}
4
      다중 상속

• 다중 상속이 유용한 경우
  – 한 객체가 이것이면서
    저것일 필요가 있을 때
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();
   }
}
5
         프레임워크
    • 상속 기반의 아키텍처
     – Template Method 패턴
     – 깨지기도 쉽고
     – 구현할 클래스가 너무 많다.
    • out of the box
     – 합성을 통해 그대로 가져다
       쓸 수 있게 해야
Factory Method 패턴
 • 자바 스윙의 예
  – 가상의 요구 사항이라는 함정
  – 유연성 위해 필요 이상으로 복잡
  – 패턴의 광신도 지양하자.

 • 구현상속으로 객체 생성 제어
  – 기반 클래스 확장도 없어서
    extends를 잘못 사용하는 예
Extends의 용도 - 다시
 • 정규화
  – 공통 연산 기반클래스에 집중
 • 한 클래스가 다른 클래스에 약간
   의 연산을 추가
 • 상속 구조의 Keypoint
  – 연산이 공유되는가?
 • 컴파일 타임 타입 검사

More Related Content

What's hot

[Swift] Data Structure - Array
[Swift] Data Structure - Array[Swift] Data Structure - Array
[Swift] Data Structure - ArrayBill Kim
 
데이터 분석 2 - 동기부여
데이터 분석 2 - 동기부여데이터 분석 2 - 동기부여
데이터 분석 2 - 동기부여Jaewook Byun
 
[Swift] Tuple
[Swift] Tuple[Swift] Tuple
[Swift] TupleBill Kim
 
데이터 분석 4 - 나만의 배열 기반 LIST, MyArrayList를 만들어보자
데이터 분석 4 - 나만의 배열 기반 LIST, MyArrayList를 만들어보자데이터 분석 4 - 나만의 배열 기반 LIST, MyArrayList를 만들어보자
데이터 분석 4 - 나만의 배열 기반 LIST, MyArrayList를 만들어보자Jaewook Byun
 
[Swift] Data Structure - Heap
[Swift] Data Structure - Heap[Swift] Data Structure - Heap
[Swift] Data Structure - HeapBill Kim
 
데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자
데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자
데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자Jaewook Byun
 

What's hot (7)

[Swift] Data Structure - Array
[Swift] Data Structure - Array[Swift] Data Structure - Array
[Swift] Data Structure - Array
 
데이터 분석 2 - 동기부여
데이터 분석 2 - 동기부여데이터 분석 2 - 동기부여
데이터 분석 2 - 동기부여
 
[Swift] Tuple
[Swift] Tuple[Swift] Tuple
[Swift] Tuple
 
데이터 분석 4 - 나만의 배열 기반 LIST, MyArrayList를 만들어보자
데이터 분석 4 - 나만의 배열 기반 LIST, MyArrayList를 만들어보자데이터 분석 4 - 나만의 배열 기반 LIST, MyArrayList를 만들어보자
데이터 분석 4 - 나만의 배열 기반 LIST, MyArrayList를 만들어보자
 
Storm 훑어보기
Storm 훑어보기Storm 훑어보기
Storm 훑어보기
 
[Swift] Data Structure - Heap
[Swift] Data Structure - Heap[Swift] Data Structure - Heap
[Swift] Data Structure - Heap
 
데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자
데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자
데이터 분석 6 - 나만의 배열 기반 LIST, MyLinkedList를 만들어보자
 

Viewers also liked

Servlet design pattern
Servlet design patternServlet design pattern
Servlet design patternSukjin Yun
 
Servlet Architecture
Servlet ArchitectureServlet Architecture
Servlet ArchitectureJU Chae
 
동영상입문
동영상입문동영상입문
동영상입문Sukjin Yun
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2SeungHyun Hwang
 
Builder, prototype, singleton pattern
Builder, prototype, singleton patternBuilder, prototype, singleton pattern
Builder, prototype, singleton patternYoonJong Choi
 
프레임워크와 어플리케이션 동시에 구축하기
프레임워크와 어플리케이션 동시에 구축하기프레임워크와 어플리케이션 동시에 구축하기
프레임워크와 어플리케이션 동시에 구축하기Sangwon Ko
 
IoC and DI Pattern
IoC and DI PatternIoC and DI Pattern
IoC and DI PatternSangwon Ko
 
스프링 트러블슈팅
스프링 트러블슈팅스프링 트러블슈팅
스프링 트러블슈팅Keesun Baik
 
디자인패턴
디자인패턴디자인패턴
디자인패턴진화 손
 
Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴Hyunho-Cho
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴Jaeho Seok
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴Sungchul Park
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법hyun soomyung
 
Jsp convert to Servlet
Jsp convert to ServletJsp convert to Servlet
Jsp convert to ServletJU Chae
 
아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리라한사 아
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)beom kyun choi
 
spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼라한사 아
 

Viewers also liked (20)

Servlet design pattern
Servlet design patternServlet design pattern
Servlet design pattern
 
Servlet Architecture
Servlet ArchitectureServlet Architecture
Servlet Architecture
 
Design patterns
Design patternsDesign patterns
Design patterns
 
동영상입문
동영상입문동영상입문
동영상입문
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2
 
Builder, prototype, singleton pattern
Builder, prototype, singleton patternBuilder, prototype, singleton pattern
Builder, prototype, singleton pattern
 
프레임워크와 어플리케이션 동시에 구축하기
프레임워크와 어플리케이션 동시에 구축하기프레임워크와 어플리케이션 동시에 구축하기
프레임워크와 어플리케이션 동시에 구축하기
 
Heartbeat
HeartbeatHeartbeat
Heartbeat
 
B Fn As
B Fn AsB Fn As
B Fn As
 
IoC and DI Pattern
IoC and DI PatternIoC and DI Pattern
IoC and DI Pattern
 
스프링 트러블슈팅
스프링 트러블슈팅스프링 트러블슈팅
스프링 트러블슈팅
 
디자인패턴
디자인패턴디자인패턴
디자인패턴
 
Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴Design patterns 스터디 -strategy패턴
Design patterns 스터디 -strategy패턴
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법
 
Jsp convert to Servlet
Jsp convert to ServletJsp convert to Servlet
Jsp convert to Servlet
 
아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리아라한사의 스프링 시큐리티 정리
아라한사의 스프링 시큐리티 정리
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)
 
spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼spring data jpa 간단한 튜토리얼
spring data jpa 간단한 튜토리얼
 

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

Java 강의자료 ed11
Java 강의자료 ed11Java 강의자료 ed11
Java 강의자료 ed11hungrok
 
Collection framework
Collection frameworkCollection framework
Collection frameworkssuser34b989
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, ScalabilityDongwook Lee
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장tedypicker
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initializationEunjoo Im
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 
Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Hyosang Hong
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙Hong Hyo Sang
 
Java mentoring of samsung scsc 3
Java mentoring of samsung scsc   3Java mentoring of samsung scsc   3
Java mentoring of samsung scsc 3도현 김
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509영석 조
 
Design patterns
Design patternsDesign patterns
Design patternsdf
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8Sangmin Lee
 
Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Sangon Lee
 

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

Scala
ScalaScala
Scala
 
Java 강의자료 ed11
Java 강의자료 ed11Java 강의자료 ed11
Java 강의자료 ed11
 
Collection framework
Collection frameworkCollection framework
Collection framework
 
Clean code appendix 1
Clean code appendix 1Clean code appendix 1
Clean code appendix 1
 
Scala, Scalability
Scala, ScalabilityScala, Scalability
Scala, Scalability
 
Scalability
ScalabilityScalability
Scalability
 
강의자료4
강의자료4강의자료4
강의자료4
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 
Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙Java 유지보수 가능한 개발 원칙
Java 유지보수 가능한 개발 원칙
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙
 
Java mentoring of samsung scsc 3
Java mentoring of samsung scsc   3Java mentoring of samsung scsc   3
Java mentoring of samsung scsc 3
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
Java_05 class
Java_05 classJava_05 class
Java_05 class
 
Java class
Java classJava class
Java class
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509
 
Design patterns
Design patternsDesign patterns
Design patterns
 
SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8SpringCamp 2013 : About Jdk8
SpringCamp 2013 : About Jdk8
 
Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동
 

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

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