디자인: 전략 (strategy) 패턴

DanChu 🌟·2022년 7월 13일
0

객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고 (캡슐화 하는 인터페이스 정의), 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것 만으로 행위의 수정이 가능하도록 만든 패턴

즉, 동일한 문제를 다른 알고리즘(전략)으로 쉽게 바꾸며 해결할 수 있도록 하는 디자인 패턴

캡슐화

필요한 속성(attribute)와 행위(method)를 하나로 묶고 그 중 일부를 외부에서 사용하지 못하도록 은닉하는 것
(자세한 예시와 설명: https://javacpro.tistory.com/31)


OCP (open-closed-principle)

  • 개방 폐쇄 원칙 : 소프트웨어 개체(클래스, 모듈, 함수)는 확장에 대해 열려있어야 하고, 수정에 대해서는 닫혀 있어야 함
  • abtraction을 통한 inversion을 통해 소스코드를 변경하지 않고 그 모듈의 행위를 바꾸는 일이 가능

자바의 인터페이스(interface)와 추상클래스(abstract class)

  • 모듈을 고정된 추상화에 의존하면 해당 모듈은 수정에 대해 닫혀 있는 것이 가능하게 됨
  • 해당 모듈의 행위는 추상화의 새 파생 클래스를 만듦으로써 확장에 대해 열려있게 됨

추상클래스

  • 일반 클래스와 유사. 단, 추상 메서드 선언으로 상속을 통해 자손 클래스에서 완성하도록 유도하는 클래스. 따라서 미완성 설계도로 존재.
  • 상속을 위한 클래스이므로 따로 객체 생성이 불가.
  • class 앞에 abstract 예약어를 사용하여 상속을 통해 구현해야 한다는 것을 알려줌

인터페이스

  • 기본 설계도 c.f. 추상클래스 = 미완성 설계도
  • 인터페이스도 추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성
  • 클래스와 다르게 다중상속이 가능

전략패턴 사용의 예시

OCP 위반

client 객체가 새로운 server 객체를 사용하도록 바꾸고 싶다면, client 클래스를 수정하여 다른 server 클래스를 사용하도록 바꿔야 함 -> 수정에 대하여 닫혀있어야하는 ocp 위반

해결책

스트레티지 패턴의 사용: 확장이 필요한 부분에 abstraction추상화를 적용하여 상위모듈이 고정된 추상화에 의존하도록 -> 만약 새로운 server객체를 사용하고 싶다면 client interface를 구현한 새로운 클래스를 추가하면 됨


자바의 오버로딩(overloading)과 오버라이딩(overriding)

오버로딩

  • 자바의 한 클래스 내 이미 사용하려는 이름과 같은 이름을 가진 메소드가 존재하더라도, 매개변수의 개수 또는 타입이 다르다면 같은 이름을 사용해서 메소드 정의가 가능 -> 다양한 유형의 호출에 응답 가능
  • 메서드 오버로딩과 생성자 오버로딩이 존재하지만, 둘 다 같은 개념

오버라이딩

  • 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용 가능
  • 메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 함
  • 오직 리턴값만 다른 것은 오버로딩이 불가

전략 패턴의 장단점

장점

  • 경직성 문제 해소 : 한 군데의 변경이 프로그램의 다른 의존적인 모듈 변경을 일으키는 위험 낮아짐
  • client가 고정된 추상화에 의존하여, 하위 모듈의 변경이 상위 모듈에 영향을 미치지 않음
  • 부동성이 없음 : 추상화를 구현한 서브 클래스는 재활용이 가능해, 원하는 부분을 모듈로부터 분리해 다른곳에 사용이 가능함

단점

  • 실제로 서비스 전 어느 부분에 변경이 필요해질지 예측하기 어려움 -> 미리 추상화를 해놓기 어려움
    - 짧은 주기로 개발하고, 소프트웨어를 빨리 자주 릴리즈 하는 것으로 단점을 보완해갈 수 있음

references

https://victorydntmd.tistory.com/292
https://myjamong.tistory.com/150
https://devbelly.tistory.com/270
https://private.tistory.com/25

0개의 댓글