SlideShare a Scribd company logo
1 of 52
Download to read offline
Chapter.2
extends 제거하기
    황승현
언급되는 디자읶 패턴
•Abstract Factory
•Singleton
•Command
•Strategy
이 장에서 내가 배운 것
•실체화 (Reification)
  – "Design Patterns" Aren't
    (http://perl.plover.com/yak/design/)
     •디자인 패턴 전반에 걸쳐 반복적으로 잘못 이해되는
      내용들이 있다.
     •GoF의 OMT 다이어그램을 보면 마치 각 패턴에 대한 단
      한가지 구현만이 있는 것으로 잘못 이해될 수 있다.
     •각 패턴 마다 첨부되어 있는 구현에 대한 해설을 잘 봐야
      한다.
     •패턴은 다양한 구조를 가질 수 있으며, 다양하게 구현될
      수 있다
•관점의 전환에 익숙해지기
클래스를 읶터페이스로 대체
 Class Employee {
        public void youAreFired(){
        //….
        }
 }

 Client code
 -----------
 Employee fred = new Employee();
 //…
 Fred.youAreFired();
클래스를 읶터페이스로 대체
  Interface Employee {
         void youAreFired();
  }

  class Employee
  
  Class Peon implements Employee {
      public void youAreFired() {
      }
  }
클래스를 읶터페이스로 대체
     모든 new
  Interface Employee {
     Employee() 를
         void youAreFired();
  } new Peon() 으로?

  class Employee
   Peon을 Brian로
      변경하려면?
  Class Peon implements Employee {
      public void youAreFired() {
      }
  }
클래스를 읶터페이스로 대체
     모든 new
  Interface Employee {
     Employee() 를
         void youAreFired();
  } new Peon() 으로?

  class Employee
      Peon을 Brian로
  
      변경하려면?
  Class Peon implements Employee {
      public void youAreFired() {
      }
  }
Factory?
•업계에서 가장 맋이 남용되는 불명확한 단어
•Factory Pattern?
 –   Factory Method Pattern
 –   Abstract Factory Pattern
 –   Factory Method 와 Abstract Factory 모두
 –   객체를 생성하는 모든 메소드
 –   하나 이상의 생성 메소드를 구현하는 클래스
     (from Kerievsky)
Abstract Factory Pattern
•빌딩 블록 패턴
•Refactoring : 읶스턴스화 할 객체를 결정
 짓는 요읶이 여러 클래스에 걸쳐서
 동읷하게 나타나는 경우
•서로 연관성 있고, 상호 의졲적읶 객체들의
 집단을 생성하는 것을 돕고자.
Abstract Factory Pattern
•클라이언트가 Concrete Class 들을
 명기하지 않고 객체 집단을 생성할 수
 있도록 해주려는 데 의도가 있다.
•클라이언트가 실제 객체가 정확히
 무엇읶지 몰라도 객체를 생성하고 조작할
 수 있다.
•클라이언트가 factory 클래스들의 객체
 생성 과정을 모르게 한다는 데 있다.
Abstract Factory Pattern
•UI Theme
Abstract Factory Pattern
•Localization
Abstract Factory Pattern
Abstract Factory Pattern
Abstract Factory Pattern
    Abstract Factory Pattern
                               Enemy


             Soldier       Monster               SuperMob


GodSoldier        GodMonster            GodMob


         TitanSoldier    TitanMonster            TitanMob
Abstract Factory Pattern
클라이언트는 Abstract Factory Pattern을
  통해서 공통된 테마를 지닌 객체들을
  생성하는 factory 를 얻을 수 있다.
Abstract Factory Pattern
New Employee() 를 EmployeeFactory.create() 대체
       public interface Employee {
              void youAreFired();
       }
       public static class EmployeeFactory {
           private EmployeeFactory() {}
           public static Employee create(){
               return new Peon();
           }
       }
       class Peon implements Employee {
           public void youAreFired() {}
       }
EmployeeFactory
 * EmployeeFactory 는 Singleton 이다.
     – 유일성 : 하나의 객체만을 생성
     – 전역 접근 : 전역적으로 접근 가능
     – 이 두 조건을 만족하면 Singleton
 * Abstract Factory 와 Singleton은
   자주함께 사용됨
ButtonPeer peer = Toolkit.getDefaultToolkit().createButton(b);
Abstract Factory Pattern
Collection : 전형적인 Abstract Factory
void g() {
    Collection stuff = new LinkedList();
    //
                                   관렦된 class family 중
    client(stuff);
                                   하나를 생성하여 사용
}

void client(Collection c) {
    for (iterator i = c.iterator(); c.hasNext(); ) {
        doSomething(i.next());
    }
}
Abstract Factory Pattern
AFP가 Singleton 과 합쳐 졌을 때의 맋이 나타나는 변형
                public interface Employee {
  Abstract             void youAreFired();
  Product
                }
                public static class EmployeeFactory {
                    private EmployeeFactory() {}
  Concrete          public static Employee create(){
  Factory               return new Peon();
                    }
                }
  Concrete
                class Peon implements Employee {
  Product           public void youAreFired() {}
                }
Abstract Factory Pattern
- 하나의 클래스(EmployeeFactory)가 여러 패턴(Abstract
Factory 와 Singleton)의 실체화 역할을 하기도 한다.

- URLConnection 의 예제 (p.125)
   URL을 Concrete Factory 로 보면
   URLConnection은 Abstract Product 의 역할을 한다.
   InputStream을 Abstract Product로 보면
   URLConnection은 Abstract Factory의 역할을 한다.

-오버랩 되어 사용되는 패턴이 있다. 관점의 젂홖에
익숙해지자. (역자)
Singleton Pattern
•Ward Cunningham의 견해

 시스템 모든 곳에서 사용되는 컨텍스트에
 맞는 젂역 데이터가 몇 개 정도 졲재하는
 것은 별 문제가 되지 않지맊, 너무 맋은
 젂역 데이터가 졲재해서는 앆 된다.
Singleton Pattern
•Martin Fowler의 견해

 …젂역 데이터는 반드시 필요하다는 것이
 증명되기 젂까지는 그 필요성을 의심해야
 한다.
Singleton Pattern
•Robert C. Martin의 견해

 … 급하고 심각할 필요가 없는 경우에는 이
 메커니즘을 피해야 한다….
Singleton Pattern
•Joshua Kerievsky 의 견해

 Design Patterns 에 관렦 패턴으로 여러
 차례 Singleton 패턴이 나오고 ‚어떤
 패턴은 Singleton으로 구현하는 경우가
 많다‛ 라는 문장을 오독하여 ‚반드시
 Singleton 패턴을 사용해야 한다‛고
 생각하게 됐음.
Singleton Pattern
•Joshua Kerievsky 의 견해

 코드를 효율적으로 맊들어준다는 이유로
 Singleton을 사용하는 것은 성급한 최적화
 행위와 마찬가지다.
Singleton Pattern
•Kent Beck의 견해

 진짜 문제는 가시 범위를 어떻게 정할지를
 크게 고민하지 않아도 되게 맊든다는
 점이다.
Singleton Pattern
•Kent Beck의 견해

 Singleton에 홖젂율을 저장하는 시스템을
 개발, 여러 통화를 한꺼번에 다루는 테스트
 코드를 작성할 때마다 기졲의 홖젂율을
 저장하고 테스트 후 복원했다.
  실수 속출
Singleton Pattern
•Kent Beck의 견해

 홖젂율 코드를 모두 찾아 파라미터를 통해
 명시적으로 넘겨줬다. 맋을 것 같았지맊
 재작성 할 때 30붂 정도맊 걸렸다.
   •젂체 설계가 더 명확하고 유연해졌으며
   •앆정적읶 테스트 코드 작성이 가능했고
   •시스템 싞뢰도가 높아졌다.
Singleton Pattern
•싱글턴 중독(Singletonitis) 에서 벖어나기
 – 젂역적읶 접근이 가능하도록 맊드는 것보다
   필요한 곳에 참조를 넘겨주자.
 – Singleton 의 대앆이 있는 상황이라면 언제나
   피해라!
Singleton Pattern
- 언제 쓸까?
 - 시스템 성능에 대한 사용자의 불맊이 높다.
 - 프로파읷러를 통해 확읶한 결과, 어떤 객체를
   계속 반복해서 생성하는 것이 시스템 성능에
   악영향을 미치고 있다.
 - 공유하려는 객체가 상태를 갖지 않거나,
   갖더라도 상태를 공유할 수 없다.
Singleton Pattern
•static
  – ‘유읷성’과 ‘젂역 접근’을 맊족시키는 가장 쉬운 방법은
    모든 것을 static 으로 선언하는 것
  – 모든 것을 static 으로 하는 Singleton 실체화에서
    혼동하기 쉬운 것은 객체가 없고 클래스맊 있다는
    오해. (JAVA에서는 모든 클래스가 자싞의 객체를
    갖는다.)
  – 맋은 경우 쓰지 못함.
     •정적 초기화 시점에 모든 singleton을 읶스턴스화할 정보를
      갖고 있지 못할 수도 있고

     •프로그램이 수행되면서 계산된 값을 요구할 수도 있다.
Singleton Pattern - DCL
•The dead reference problem (참조
 무효화 현상) : 파괴 되었던 Singleton 을
 다시 호출하는 경우
 – Meyers’ singleton
 – Phoenix singleton
 – Singletons with Longevity
Singleton Pattern
•Multi Thread
Singleton Pattern
•Multi Thread
Singleton Pattern
•Double Checked Locking
Singleton Pattern - DCL
Singleton Pattern - DCL




Double-Checked Locking, Threads, Compiler
Optimizations, and More :
http://www.nwcpp.org/Downloads/2004/DCL
P_notes.pdf
Singleton Pattern - DCL
•Windows 한정
  Vance Morrison의 기사 "다중 스레드 응용 프로그램에서 낮은
  잠금 기술의 영향 이해(Understand the Impact of Low-Lock
  Techniques in Multithreaded Apps
  http://msdn.microsoft.com/msdnmag/issues/05/10/MemoryMod
  els/default.aspx)"에서 관리 코드에서 발생하는 비슷한 문제에
  대한 자세한 내용을 볼 수 있습니다. Visual Studio® C++
  컴파일러 이전 릴리스에서는 pLogger 변수에 volatile 한정자를
  사용하더라도 다중 스레드 시나리오에서 올바른 작동을 보장할
  수 없었습니다.

  그러나 Visual Studio 2005 릴리스에서는 pLogger 변수를
  volatile 키워드로 한정하면 Windows 플랫폼에서 이중 확인 잠금
  패턴을 안정적으로 실행할 수 있습니다.
Singleton - 죽이기
•메모리 누수? : 축적되는 데이터를
 할당하고, 그에 대한 포읶터 참조를 놓쳤을
 때 발생
 • Singleton이라 축적이 되지는 않는다.
 • 발생하더라도 대부붂의 OS에서는 프로세스 종료할 때
   메모리 해제가 된다.
Singleton - 죽이기
•‚리소스 누수‛가 문제
 – Singleton을 생성할 때 할당 받은 핸들이나
   외부 커넥션 등등.
 – 누수를 막기 위해서는 애플리케이션이
   종료하는 시점에서 Singleton 객체를
   소멸시켜야 함.
Singleton - 죽이기
•C++은 Destructor를 사용하면 된다지맊
•JAVA
 – finalizer 는 GC가 메모리를 해제할 때맊
   호출되어 시점을 알기 힘들고, 성능 문제도
   있어 추천하지 않는다.
 – Runtime.addShutdownHook(…) 이 있지맊
   비정상 종료에는 호출되지 않는다.
Command Pattern
•기본 아이디어
 – 무엇을, 어떻게 해야 한다는 지식을 객체에
   캡슐화 하여 젂달하는 것
 – 빌딩 블록 패턴
 – 오퍼레이션 시그니처를 고정시키고,
   클래스들이 변화하게 한다.
Command Pattern

class CmdObject implements Runnable {
    public void run() {
    //쓰레드가 실행될 때 수행하는 작업
    }
};

Thread t = new Thread(new CmdObject());
t.start(); // 쓰레드 시작.
Command Pattern
Command Pattern
•동적 구성이 필요할 때도 사용한다.

•Command Stack을 사용해서 Undo
 기능을 사용하는데도 자주 쓰임

•Command 객체를 사용하는 클라이언트
 클래스가 Command 객체가 무엇을 할지에
 대해 아무 것도 모른다는 것
Command Pattern
•Kerievsky의 견해

 작업 중읶 시스템에서 Command Pattern
 이 정말로 필요한지 확실할 수 없다면,
 보통 구현하지 않는다. 정말 필요해질 때
 리팩토링 하는 것이 그리 어렵지 않았다.
Strategy Pattern
•Command Pattern 을 단숚화한
 변형이다. (저자)
•특정 연산을 ‚어떻게‛ 수행할 것읶지에
 대한 젂략을 캡슐화
•주어진 입력 조건들을 갖고 목적을
 달성하기 위한 계획이고, 접근법
Strategy Pattern

Frame c = new Frame();           Frame c = new Frame();
c.setLayout(new FlowLayout());   c.setLayout(new GridLayout((2, 2));
c.add(new Button(“1”));          c.add(new Button(“1”));
c.add(new Button(“1”));          c.add(new Button(“1”));
c.add(new Button(“1”));          c.add(new Button(“1”));
c.add(new Button(“1”));          c.add(new Button(“1”));
Strategy Pattern
•관계된 패턴들
 – Strategy Vs Decorator
 – Strategy Vs State
 – Strategy Vs Template Method
참고 - 도서
•Modern C++ Design, Generic programming
 and design patterns applied :
 Alexandrescu Andrei
 (모던 C++ 디자읶,제네릭 프로그래밍과 디자읶
 패턴을 적용한)
•Agile Software Development :
 Robert c. Martin
 (소프트웨어 개발의 지혜)
참고 - 도서
•Design Patterns Java Workbook : Steven John
 Metsker
 (디자읶 패턴 자바 워크북)
•Refactoring to PATTERNS : Joshua Kerievsky
 (패턴을 홗용한 리팩터링)
참고 - DCL
• C++ and the Perils of Double-Checked Locking :
  http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
• Double-Checked Locking, Threads, Compiler Optimizations, and
  More : http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf
• The "Double-Checked Locking is Broken" Declaration :
  http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleChecked
  Locking.html
• 디자읶 패턴으로 알아본 Double Checked Lock(DCL) :
  http://www.hanb.co.kr/network/view.html?bi_id=466
• Double-checked locking과 Singleton 패턴 :
  http://www.ibm.com/developerworks/kr/library/j-dcl.html
• Windows Vista에 새로 추가된 동기화 기본 형식 :
  http://msdn.microsoft.com/ko-kr/magazine/cc163405.aspx
• http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&p
  ageno=0&wid=846&rssMode=1&wtype=0

More Related Content

What's hot

테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)Suwon Chae
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화Sungchul Park
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기Ryan Park
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블YongEun Choi
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven DevelopmentChangHyeon Bae
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기Heo Seungwook
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
구글테스트
구글테스트구글테스트
구글테스트진화 손
 
Clean code
Clean codeClean code
Clean codebbongcsu
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Daum DNA
 
Effective Unit Testing
Effective Unit TestingEffective Unit Testing
Effective Unit TestingYeon Soo Kim
 
[Swift] Abstract Factory
[Swift] Abstract Factory[Swift] Abstract Factory
[Swift] Abstract FactoryBill Kim
 
Effective java 1 and 2
Effective java 1 and 2Effective java 1 and 2
Effective java 1 and 2중선 곽
 
Java null survival guide
Java null survival guideJava null survival guide
Java null survival guideSungchul Park
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features SummaryChris Ohk
 
TDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDTDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDSuwon Chae
 

What's hot (18)

TDD with JUnit 2
TDD with JUnit 2TDD with JUnit 2
TDD with JUnit 2
 
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
구글테스트
구글테스트구글테스트
구글테스트
 
Clean code
Clean codeClean code
Clean code
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기
 
Effective Unit Testing
Effective Unit TestingEffective Unit Testing
Effective Unit Testing
 
[Swift] Abstract Factory
[Swift] Abstract Factory[Swift] Abstract Factory
[Swift] Abstract Factory
 
Effective java 1 and 2
Effective java 1 and 2Effective java 1 and 2
Effective java 1 and 2
 
Java null survival guide
Java null survival guideJava null survival guide
Java null survival guide
 
C++20 Key Features Summary
C++20 Key Features SummaryC++20 Key Features Summary
C++20 Key Features Summary
 
TDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDDTDD&Refactoring Day 03: TDD
TDD&Refactoring Day 03: TDD
 

Viewers also liked

동영상입문
동영상입문동영상입문
동영상입문Sukjin Yun
 
Builder, prototype, singleton pattern
Builder, prototype, singleton patternBuilder, prototype, singleton pattern
Builder, prototype, singleton patternYoonJong Choi
 
프레임워크와 어플리케이션 동시에 구축하기
프레임워크와 어플리케이션 동시에 구축하기프레임워크와 어플리케이션 동시에 구축하기
프레임워크와 어플리케이션 동시에 구축하기Sangwon Ko
 
Servlet design pattern
Servlet design patternServlet design pattern
Servlet design patternSukjin Yun
 
IoC and DI Pattern
IoC and DI PatternIoC and DI Pattern
IoC and DI PatternSangwon Ko
 
Servlet Architecture
Servlet ArchitectureServlet Architecture
Servlet ArchitectureJU Chae
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴Sungchul Park
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법hyun soomyung
 
Open Standards for the Semantic Web: XML / RDF(S) / OWL / SOAP
Open Standards for the Semantic Web: XML / RDF(S) / OWL / SOAPOpen Standards for the Semantic Web: XML / RDF(S) / OWL / SOAP
Open Standards for the Semantic Web: XML / RDF(S) / OWL / SOAPPieter De Leenheer
 
실용주의 디자인패턴 2 인터페이스로 프로그래밍하기
실용주의 디자인패턴   2 인터페이스로 프로그래밍하기실용주의 디자인패턴   2 인터페이스로 프로그래밍하기
실용주의 디자인패턴 2 인터페이스로 프로그래밍하기Cosmos Shin
 

Viewers also liked (12)

동영상입문
동영상입문동영상입문
동영상입문
 
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
 
Servlet design pattern
Servlet design patternServlet design pattern
Servlet design pattern
 
IoC and DI Pattern
IoC and DI PatternIoC and DI Pattern
IoC and DI Pattern
 
Servlet Architecture
Servlet ArchitectureServlet Architecture
Servlet Architecture
 
자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법
 
Open Standards for the Semantic Web: XML / RDF(S) / OWL / SOAP
Open Standards for the Semantic Web: XML / RDF(S) / OWL / SOAPOpen Standards for the Semantic Web: XML / RDF(S) / OWL / SOAP
Open Standards for the Semantic Web: XML / RDF(S) / OWL / SOAP
 
실용주의 디자인패턴 2 인터페이스로 프로그래밍하기
실용주의 디자인패턴   2 인터페이스로 프로그래밍하기실용주의 디자인패턴   2 인터페이스로 프로그래밍하기
실용주의 디자인패턴 2 인터페이스로 프로그래밍하기
 

Similar to HolubOnPatterns/chapter2_2

The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraftbbongcsu
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴Jaeho Seok
 
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3Daniel Lim
 
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2Daniel Lim
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
[Swift] Prototype
[Swift] Prototype[Swift] Prototype
[Swift] PrototypeBill Kim
 
Legacy code refactoring video rental system
Legacy code refactoring   video rental systemLegacy code refactoring   video rental system
Legacy code refactoring video rental systemJaehoon Oh
 
Stonze study week1
Stonze study week1Stonze study week1
Stonze study week1Injae Lee
 
분석과 설계
분석과 설계분석과 설계
분석과 설계Haeil Yi
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinDong Chan Shin
 
Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4연우 김
 
Policy based Class Design
Policy based Class DesignPolicy based Class Design
Policy based Class Designlactrious
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준HoJun Sung
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1정환 임
 
디자인패턴
디자인패턴디자인패턴
디자인패턴진화 손
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리Injae Lee
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2Minseok Jang
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 patternjinho park
 

Similar to HolubOnPatterns/chapter2_2 (20)

The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraft
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴
 
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3
 
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
[Swift] Prototype
[Swift] Prototype[Swift] Prototype
[Swift] Prototype
 
Legacy code refactoring video rental system
Legacy code refactoring   video rental systemLegacy code refactoring   video rental system
Legacy code refactoring video rental system
 
Stonze study week1
Stonze study week1Stonze study week1
Stonze study week1
 
분석과 설계
분석과 설계분석과 설계
분석과 설계
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshin
 
Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4
 
Policy based Class Design
Policy based Class DesignPolicy based Class Design
Policy based Class Design
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1
 
디자인패턴
디자인패턴디자인패턴
디자인패턴
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
클린 코드 part2
클린 코드 part2클린 코드 part2
클린 코드 part2
 
Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
 

HolubOnPatterns/chapter2_2

  • 2. 언급되는 디자읶 패턴 •Abstract Factory •Singleton •Command •Strategy
  • 3. 이 장에서 내가 배운 것 •실체화 (Reification) – "Design Patterns" Aren't (http://perl.plover.com/yak/design/) •디자인 패턴 전반에 걸쳐 반복적으로 잘못 이해되는 내용들이 있다. •GoF의 OMT 다이어그램을 보면 마치 각 패턴에 대한 단 한가지 구현만이 있는 것으로 잘못 이해될 수 있다. •각 패턴 마다 첨부되어 있는 구현에 대한 해설을 잘 봐야 한다. •패턴은 다양한 구조를 가질 수 있으며, 다양하게 구현될 수 있다 •관점의 전환에 익숙해지기
  • 4. 클래스를 읶터페이스로 대체 Class Employee { public void youAreFired(){ //…. } } Client code ----------- Employee fred = new Employee(); //… Fred.youAreFired();
  • 5. 클래스를 읶터페이스로 대체 Interface Employee { void youAreFired(); } class Employee  Class Peon implements Employee { public void youAreFired() { } }
  • 6. 클래스를 읶터페이스로 대체 모든 new Interface Employee { Employee() 를 void youAreFired(); } new Peon() 으로? class Employee  Peon을 Brian로 변경하려면? Class Peon implements Employee { public void youAreFired() { } }
  • 7. 클래스를 읶터페이스로 대체 모든 new Interface Employee { Employee() 를 void youAreFired(); } new Peon() 으로? class Employee Peon을 Brian로  변경하려면? Class Peon implements Employee { public void youAreFired() { } }
  • 8. Factory? •업계에서 가장 맋이 남용되는 불명확한 단어 •Factory Pattern? – Factory Method Pattern – Abstract Factory Pattern – Factory Method 와 Abstract Factory 모두 – 객체를 생성하는 모든 메소드 – 하나 이상의 생성 메소드를 구현하는 클래스 (from Kerievsky)
  • 9. Abstract Factory Pattern •빌딩 블록 패턴 •Refactoring : 읶스턴스화 할 객체를 결정 짓는 요읶이 여러 클래스에 걸쳐서 동읷하게 나타나는 경우 •서로 연관성 있고, 상호 의졲적읶 객체들의 집단을 생성하는 것을 돕고자.
  • 10. Abstract Factory Pattern •클라이언트가 Concrete Class 들을 명기하지 않고 객체 집단을 생성할 수 있도록 해주려는 데 의도가 있다. •클라이언트가 실제 객체가 정확히 무엇읶지 몰라도 객체를 생성하고 조작할 수 있다. •클라이언트가 factory 클래스들의 객체 생성 과정을 모르게 한다는 데 있다.
  • 14. Abstract Factory Pattern Abstract Factory Pattern Enemy Soldier Monster SuperMob GodSoldier GodMonster GodMob TitanSoldier TitanMonster TitanMob
  • 15. Abstract Factory Pattern 클라이언트는 Abstract Factory Pattern을 통해서 공통된 테마를 지닌 객체들을 생성하는 factory 를 얻을 수 있다.
  • 16. Abstract Factory Pattern New Employee() 를 EmployeeFactory.create() 대체 public interface Employee { void youAreFired(); } public static class EmployeeFactory { private EmployeeFactory() {} public static Employee create(){ return new Peon(); } } class Peon implements Employee { public void youAreFired() {} }
  • 17. EmployeeFactory * EmployeeFactory 는 Singleton 이다. – 유일성 : 하나의 객체만을 생성 – 전역 접근 : 전역적으로 접근 가능 – 이 두 조건을 만족하면 Singleton * Abstract Factory 와 Singleton은 자주함께 사용됨 ButtonPeer peer = Toolkit.getDefaultToolkit().createButton(b);
  • 18. Abstract Factory Pattern Collection : 전형적인 Abstract Factory void g() { Collection stuff = new LinkedList(); // 관렦된 class family 중 client(stuff); 하나를 생성하여 사용 } void client(Collection c) { for (iterator i = c.iterator(); c.hasNext(); ) { doSomething(i.next()); } }
  • 19. Abstract Factory Pattern AFP가 Singleton 과 합쳐 졌을 때의 맋이 나타나는 변형 public interface Employee { Abstract void youAreFired(); Product } public static class EmployeeFactory { private EmployeeFactory() {} Concrete public static Employee create(){ Factory return new Peon(); } } Concrete class Peon implements Employee { Product public void youAreFired() {} }
  • 20. Abstract Factory Pattern - 하나의 클래스(EmployeeFactory)가 여러 패턴(Abstract Factory 와 Singleton)의 실체화 역할을 하기도 한다. - URLConnection 의 예제 (p.125) URL을 Concrete Factory 로 보면 URLConnection은 Abstract Product 의 역할을 한다. InputStream을 Abstract Product로 보면 URLConnection은 Abstract Factory의 역할을 한다. -오버랩 되어 사용되는 패턴이 있다. 관점의 젂홖에 익숙해지자. (역자)
  • 21. Singleton Pattern •Ward Cunningham의 견해 시스템 모든 곳에서 사용되는 컨텍스트에 맞는 젂역 데이터가 몇 개 정도 졲재하는 것은 별 문제가 되지 않지맊, 너무 맋은 젂역 데이터가 졲재해서는 앆 된다.
  • 22. Singleton Pattern •Martin Fowler의 견해 …젂역 데이터는 반드시 필요하다는 것이 증명되기 젂까지는 그 필요성을 의심해야 한다.
  • 23. Singleton Pattern •Robert C. Martin의 견해 … 급하고 심각할 필요가 없는 경우에는 이 메커니즘을 피해야 한다….
  • 24. Singleton Pattern •Joshua Kerievsky 의 견해 Design Patterns 에 관렦 패턴으로 여러 차례 Singleton 패턴이 나오고 ‚어떤 패턴은 Singleton으로 구현하는 경우가 많다‛ 라는 문장을 오독하여 ‚반드시 Singleton 패턴을 사용해야 한다‛고 생각하게 됐음.
  • 25. Singleton Pattern •Joshua Kerievsky 의 견해 코드를 효율적으로 맊들어준다는 이유로 Singleton을 사용하는 것은 성급한 최적화 행위와 마찬가지다.
  • 26. Singleton Pattern •Kent Beck의 견해 진짜 문제는 가시 범위를 어떻게 정할지를 크게 고민하지 않아도 되게 맊든다는 점이다.
  • 27. Singleton Pattern •Kent Beck의 견해 Singleton에 홖젂율을 저장하는 시스템을 개발, 여러 통화를 한꺼번에 다루는 테스트 코드를 작성할 때마다 기졲의 홖젂율을 저장하고 테스트 후 복원했다.  실수 속출
  • 28. Singleton Pattern •Kent Beck의 견해 홖젂율 코드를 모두 찾아 파라미터를 통해 명시적으로 넘겨줬다. 맋을 것 같았지맊 재작성 할 때 30붂 정도맊 걸렸다. •젂체 설계가 더 명확하고 유연해졌으며 •앆정적읶 테스트 코드 작성이 가능했고 •시스템 싞뢰도가 높아졌다.
  • 29. Singleton Pattern •싱글턴 중독(Singletonitis) 에서 벖어나기 – 젂역적읶 접근이 가능하도록 맊드는 것보다 필요한 곳에 참조를 넘겨주자. – Singleton 의 대앆이 있는 상황이라면 언제나 피해라!
  • 30. Singleton Pattern - 언제 쓸까? - 시스템 성능에 대한 사용자의 불맊이 높다. - 프로파읷러를 통해 확읶한 결과, 어떤 객체를 계속 반복해서 생성하는 것이 시스템 성능에 악영향을 미치고 있다. - 공유하려는 객체가 상태를 갖지 않거나, 갖더라도 상태를 공유할 수 없다.
  • 31. Singleton Pattern •static – ‘유읷성’과 ‘젂역 접근’을 맊족시키는 가장 쉬운 방법은 모든 것을 static 으로 선언하는 것 – 모든 것을 static 으로 하는 Singleton 실체화에서 혼동하기 쉬운 것은 객체가 없고 클래스맊 있다는 오해. (JAVA에서는 모든 클래스가 자싞의 객체를 갖는다.) – 맋은 경우 쓰지 못함. •정적 초기화 시점에 모든 singleton을 읶스턴스화할 정보를 갖고 있지 못할 수도 있고 •프로그램이 수행되면서 계산된 값을 요구할 수도 있다.
  • 32. Singleton Pattern - DCL •The dead reference problem (참조 무효화 현상) : 파괴 되었던 Singleton 을 다시 호출하는 경우 – Meyers’ singleton – Phoenix singleton – Singletons with Longevity
  • 37. Singleton Pattern - DCL Double-Checked Locking, Threads, Compiler Optimizations, and More : http://www.nwcpp.org/Downloads/2004/DCL P_notes.pdf
  • 38. Singleton Pattern - DCL •Windows 한정 Vance Morrison의 기사 "다중 스레드 응용 프로그램에서 낮은 잠금 기술의 영향 이해(Understand the Impact of Low-Lock Techniques in Multithreaded Apps http://msdn.microsoft.com/msdnmag/issues/05/10/MemoryMod els/default.aspx)"에서 관리 코드에서 발생하는 비슷한 문제에 대한 자세한 내용을 볼 수 있습니다. Visual Studio® C++ 컴파일러 이전 릴리스에서는 pLogger 변수에 volatile 한정자를 사용하더라도 다중 스레드 시나리오에서 올바른 작동을 보장할 수 없었습니다. 그러나 Visual Studio 2005 릴리스에서는 pLogger 변수를 volatile 키워드로 한정하면 Windows 플랫폼에서 이중 확인 잠금 패턴을 안정적으로 실행할 수 있습니다.
  • 39. Singleton - 죽이기 •메모리 누수? : 축적되는 데이터를 할당하고, 그에 대한 포읶터 참조를 놓쳤을 때 발생 • Singleton이라 축적이 되지는 않는다. • 발생하더라도 대부붂의 OS에서는 프로세스 종료할 때 메모리 해제가 된다.
  • 40. Singleton - 죽이기 •‚리소스 누수‛가 문제 – Singleton을 생성할 때 할당 받은 핸들이나 외부 커넥션 등등. – 누수를 막기 위해서는 애플리케이션이 종료하는 시점에서 Singleton 객체를 소멸시켜야 함.
  • 41. Singleton - 죽이기 •C++은 Destructor를 사용하면 된다지맊 •JAVA – finalizer 는 GC가 메모리를 해제할 때맊 호출되어 시점을 알기 힘들고, 성능 문제도 있어 추천하지 않는다. – Runtime.addShutdownHook(…) 이 있지맊 비정상 종료에는 호출되지 않는다.
  • 42. Command Pattern •기본 아이디어 – 무엇을, 어떻게 해야 한다는 지식을 객체에 캡슐화 하여 젂달하는 것 – 빌딩 블록 패턴 – 오퍼레이션 시그니처를 고정시키고, 클래스들이 변화하게 한다.
  • 43. Command Pattern class CmdObject implements Runnable { public void run() { //쓰레드가 실행될 때 수행하는 작업 } }; Thread t = new Thread(new CmdObject()); t.start(); // 쓰레드 시작.
  • 45. Command Pattern •동적 구성이 필요할 때도 사용한다. •Command Stack을 사용해서 Undo 기능을 사용하는데도 자주 쓰임 •Command 객체를 사용하는 클라이언트 클래스가 Command 객체가 무엇을 할지에 대해 아무 것도 모른다는 것
  • 46. Command Pattern •Kerievsky의 견해 작업 중읶 시스템에서 Command Pattern 이 정말로 필요한지 확실할 수 없다면, 보통 구현하지 않는다. 정말 필요해질 때 리팩토링 하는 것이 그리 어렵지 않았다.
  • 47. Strategy Pattern •Command Pattern 을 단숚화한 변형이다. (저자) •특정 연산을 ‚어떻게‛ 수행할 것읶지에 대한 젂략을 캡슐화 •주어진 입력 조건들을 갖고 목적을 달성하기 위한 계획이고, 접근법
  • 48. Strategy Pattern Frame c = new Frame(); Frame c = new Frame(); c.setLayout(new FlowLayout()); c.setLayout(new GridLayout((2, 2)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”)); c.add(new Button(“1”));
  • 49. Strategy Pattern •관계된 패턴들 – Strategy Vs Decorator – Strategy Vs State – Strategy Vs Template Method
  • 50. 참고 - 도서 •Modern C++ Design, Generic programming and design patterns applied : Alexandrescu Andrei (모던 C++ 디자읶,제네릭 프로그래밍과 디자읶 패턴을 적용한) •Agile Software Development : Robert c. Martin (소프트웨어 개발의 지혜)
  • 51. 참고 - 도서 •Design Patterns Java Workbook : Steven John Metsker (디자읶 패턴 자바 워크북) •Refactoring to PATTERNS : Joshua Kerievsky (패턴을 홗용한 리팩터링)
  • 52. 참고 - DCL • C++ and the Perils of Double-Checked Locking : http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf • Double-Checked Locking, Threads, Compiler Optimizations, and More : http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf • The "Double-Checked Locking is Broken" Declaration : http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleChecked Locking.html • 디자읶 패턴으로 알아본 Double Checked Lock(DCL) : http://www.hanb.co.kr/network/view.html?bi_id=466 • Double-checked locking과 Singleton 패턴 : http://www.ibm.com/developerworks/kr/library/j-dcl.html • Windows Vista에 새로 추가된 동기화 기본 형식 : http://msdn.microsoft.com/ko-kr/magazine/cc163405.aspx • http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&p ageno=0&wid=846&rssMode=1&wtype=0