woowacourse-study / 2022-modern-java-in-action

우아한테크코스 4기 모던 자바 인 액션 스터디
10 stars 4 forks source link

전략 패턴과 상속(템플릿 메서드 패턴)의 차이는 무엇일까? #21

Open sure-why-not opened 2 years ago

sure-why-not commented 2 years ago

문제

p.72 그림 2-1 예시를 보면 인터페이스를 사용하는 전략 패턴이 아닌 추상 클래스와 상속으로도 해결할 수 있다. 그렇다면 전략 패턴과 상속을 사용한 템플릿 메서드 패턴의 차이는 무엇이며, 각각 어떤 상황에서 사용하는 것이 적절할까?

선정 배경

미션을 하면서도 전략 패턴을 사용했지만, 상속을 사용할 수도 있지 않을까? 하는 생각이 들기도 했었다. 두 차이점에 대해 학습하고, 전략 패턴도 분명 단점이 있을 수 있기 때문에 적절한 상황에서 사용하도록 학습해보면 좋을 것 같다.

관련 챕터

[2장] 동작 파라미터화 코드 전달하기

sure-why-not commented 2 years ago

다형성을 활용하는 방법이 다를 뿐이고, 이뤄내려는 목적은 동일하게 이룰 수 있다.

이뤄내려는 목적은 일부 과정의 구현만 다르고 완전히 동일한 절차를 가진 코드를 작성하게 될 때이고, 다형성을 활용하는 차이는 전략 패턴은 인터페이스의 구현체를 통해서 다형성을 활용하고, 템플릿 메서드 패턴은 상속을 통해 다형성을 활용한다.

템플릿 메서드 패턴

전략 패턴

적절한 사용 시기

런타임 때 로직을 변경해야 하는 경우 - 전략 패턴

전략 패턴은 컨텍스트 클래스가 전략(Strategy)을 속성(필드, 인스턴스 변수)으로 가지고 있다보니, setter 메서드를 통해 런타임 도중에 전략(Strategy)을 변경할 수 있다.

하지만 템플릿 메서드 패턴은 로직을 변경하려면 클래스로부터 인스턴스를 새로 생성해야 한다. 따라서 런타임 도중에 로직을 변경할 수가 없다.

컨텍스트 클래스가 상속을 받은 클래스인 경우 - 전략 패턴

템플릿 메서드 패턴이 기본적으로 ‘상속’을 활용한 구조이다. 그러다보니 원래 컨텍스트 클래스가 상속을 받고 있는 클래스라면, 템플릿 메서드 패턴을 사용하는 순간 상속의 깊이가 1단계에서 2단계가 된다. 상속 구조가 깊어지면 유지보수가 힘들어 진다.

반면 전략 패턴은 ‘상속 구조’를 사용하는 구조가 아니므로, 상속 구조가 더 깊어지지 않는다.

위 경우를 제외한 상황 - 템플릿 메서드 패턴

템플릿 메서드 패턴이 ‘상속’과 ‘추상 클래스’를 사용해서 구현하다보니, 사람이 생각하기에 가장 직관적으로 코드를 구현할 수 있게 된다. 또한 전략 패턴에서 사용하는 객체를 주입해서 로직을 완성시켜야 하는 ‘의존성 주입(DI)’에 대한 코드를 작성하지 않아도 되서, 훨씬 간단하게 구현할 수 있다.

참고