관리 메뉴

버리야 날자

[디자인패턴] 1. Strategy Pattern 본문

나만의 작업

[디자인패턴] 1. Strategy Pattern

버리 버리야 2007.01.21 13:29
1. Strategy Pattern

알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다.
알고리즘(전략,작전,책략)을 교체해서 동일한 문제를 다른 방법으로 해결하는 패턴
실행 중에 교체하는 것이 가능하다. – 다형성을 이용해서

"상속"을 이용해 프로그램을 할때의 단점

1) 서브클래스의 코드 중복
  부모클래스에서 메소드 fly()를 구현해 놓았다면(abstract일때) 서브 클래스에서는
  fly()를 쓰지 않아야 할때 매번 안쓴다는 코드를 구현해야 한다.
  (불필요한 행동을 그냥 아무것도 하지 않는것으로 오버라이드 해야한다.
  만약 규격이 자주 바뀌게 되면 매번 프로그램에 추가했던 부모클래스를 상속받은
  서브클래스의 메소드를 모두 일일이 살펴봐야한다.)

2) 실행시에 특징을 바꾸기 힘들다.

3) 모든 행동을 알기 힘들다.

4) 코드를 변경했을 때 다른 클래스에 원치 않은 영향을 끼칠수 있다.

덧 - “인터페이스”를 이용해 프로그램을 할때의 단점
자바 인터페이스에는 구현된 코드가 전혀 들어가지 않기 때문에 코드 재사용을 할 수 없다는 문제점이 있다. 즉 한 행동을 바꿀 때마다 그 행동이 정의되어 있는 서로 다른 서브클래스들을 전부 찾아서 코드를 일일이 고쳐야 하고, 그 과정에서 새로운 버그가 생길 가능성이 있다.

덧 - Interface와 Abstract Class
Interface는 구현된 Method가 없다. 모두 선언만 되어 있다.
Abstract Class는 일부분 구현된 Method가 있고 추상 Method는 하나 이상 있어야 하고 일반 Method도 있을수 있다.

디자인패턴 Point
소프트웨어를 만들 때, 나중에 혹시 고쳐야 할 때도 기존 코드에 미치는 영향은 최소한으로 줄이면서 작업을 할 수 있도록 만들수 있는 방법이 있다면 정말 행복하지 않을까?

디자인원칙
1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다.
달라지는 부분을 찾아서 나머지 코드에 영향을 주지 않도록 “캡슐화”한다.
그렇게 하면 나중에 바뀌지 않는 부분에는 영향을 미치지 않은채로 그 부분만 고치거나 확장할 수 있다.

2. 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
상위(추상Class나 interface) 형식에 맞춰 프로그래밍한다.
실제 실행시에 쓰는 객체가 코드에 의해서 고정되지 않도록, 어떤 상위 형식(supertype)에 맞춰서 프로그래밍함으로써 다형성을 활용해야 한다.

Dog d = new Dog();
d.bark();

Animal animal = new Dog();            //Dog을 Cat으로 바꿀수 있다. – 다형성이용
Animal.makeSound();

더 바람직한 방법
new Dog() 같은 식으로 직접 코드를 만드는 대신 구체적으로 구현된 객체를 실행시에 대입하는 것.
A = getAnimal();
a.makeSound();

3. 상속보다는 구성을 활용한다.
구성 : “A는 B이다” 보다는 “A에는 B가 있다”가 나을수 있다.
“A에는 B가 있다” 관계에 대해 생각해 보면 각 오리에는 FlyBehavior와 QuackBehavior가 있으며, 각각 행동과 꽥꽥 거리는 행동을 위임 받는다
두 클래스를 이런식으로 합치는 것을 구성(composition)을 이용하는 것이라고 부른다.

한번 Think! 해보기
동적으로 행동을 지정하는 방법
상속과 interface를 통해 “동적”으로 코드를 쓰는 방법을 해결하는 방식 연구하기


- Head First Design Pattern을 공부하며

5 Comments
  • BlogIcon Heart 2007.01.22 00:07 신고 저도 Head First Design Pattern 책 사보려고 하는데 책 괜찮나요?
    정리를 너무 깔끔하게 잘 하셔서 이게 책 내용인지 정리하신 건지 감이 잘 안잡힐 정도네요;;
  • BlogIcon 버리 2007.01.23 00:56 신고 책 괜찮아요. 한마디로 좋아요!!!ㅎㅎㅎ
    정리한다고 했는데 전 전혀 만족치못해요
    정말 이쁘게 잘 문서를 만드시는 분 보면
    너무 부러워서,,,늘 노력하고 있습니다^^
  • BlogIcon Sharr 2007.01.22 10:51 신고 헤드퍼스트책 좋은것 같아요 전 헤드퍼스트자바를 샀는데..무엇보다 풍부한 해설과
    전혀 새로운곳을 건드려 주죠..ㅋ
    실무에선 디자인패턴이 중요한가봐요..
    저희도 그거 과정중에 속해있는데..
    제 후배는 그거 배웠는데 전 아직 안배웠어요..
    버리님도 레벨업을 위한 ^^
    꼭 마스터 하시길 바랄께요..
  • BlogIcon 버리 2007.01.23 00:57 신고 저도 이번에 Head First JAVA책 보구
    그 다음으로 디자인패턴 보구 있는중이에요
    이 책 다보면 알고리즘에 관한 책을 볼려구 하는데
    Head First는 없나?ㅎㅎ
    실무에선 프레임웍에서 디자인패턴을 많이
    적용하는것같아요,
    아직 많이는 모르지만 분석이라두 하기위해 공부하고있어요
    꼭 마스터 할게요^^ㅎㅎ
  • 염장똥꾸 2007.01.25 11:35 신고 좋은 책이지..

    언제 책좀 빌려주라..

    공부좀 하게..
댓글쓰기 폼