모든 글은 유튜브 얄팍한 코딩사전에 출처를 두고있습니다.
이번 패턴은 Template method 패턴이다.
Template method?
Template method 패턴을 간단하게 정의하면 아래와 같다.
코드 중복을 피하기 위해 템플릿을 만드는 패턴.
템플릿을 만든다는 것은 한국말로 양식을 만드는 것과 같다.
우리는 보고서같은 문서를 작성할 때 양식을 기반으로 쓰곤 한다.
양식을 사용하는 이유는 해당 부분이 공통 부분이기 때문이다.
공통된 부분은 굳이 각각 학생들이 직접 만들거나 칠 필요가 없다!
따라서 편의성을 위해 우리는 양식, 즉 템플릿을 사용한다.
사용 이유
위에서 말했듯이 굳이 직접 만들 필요가 없기 때문에 사용한다.
예를 들어 아래와 같은 클래스와 메서드가 있다고 생각해보자.
파일을 읽고, 수를 계산해서 결과를 내는 임시 코드이다.
임의로 코드 흐름만 보기 위해서 내용은 따로 구현하지 않았다.
위와 같이 코드를 짰다고 했을 때, 곱셈 연산을 추가하고 싶다고 해보자.
그럼 아래와 같이 곱셈 연산을 하는 새 클래스를 작성해야 할 것이다.
하지만 지금 파일을 불러오고 출력하는 과정이 중복됨을 볼 수 있다.
굳이 중복되는 코드들을 여러번 쳐서 코드 길이를 늘려야 할까?
이는 복잡도만 증가하게 하고 가독성도 떨어트리기만 할 것이다.
그럴 때 필요한 것이 바로 Template method 패턴!
구현
아래와 같이 추상 클래스로 Template method를 선언하도록 한다.
아래의 예시에서는 process()
함수가 Template이 되는 것이다.
그럼 이제 우리는 추상 클래스를 상속받아 사용하기만 하면 된다!
아래와 같이 calculate()
함수를 오버라이딩하여 계산 방식만 바꿔준다.
그 결과 아래와 같이 실제로 사용할 수 있는 것이다.
중복되는 코드를 부모 클래스로 올려버리고, 동작 방식만 교체했다.
하지만 사용자는 process()
로 동일하게 Template만 사용한다.
둘의 계산 방식이 다르게 성공적으로 진행되었음을 확인할 수 있다.
사용자들은 주어진 Template method만을 호출하면 된다.
개발자 입장에서는 OCP
를 지킬 수 있고, 코드 중복이 줄었다.
즉, 유지 보수에 있어서 굉장히 유리하게 작성한 것이다.
Strategy 패턴
사실 Template method 패턴은 Strategy 패턴과 매우 유사하다.
둘은 기본적으로 OCP
원칙을 지키기 위해 사용한다는 점이 같다.
다양한 전략들을 필요에 따라 갈아 끼우는 것이 매우 유사하다.
하지만 둘은 명확한 차이점이 존재한다.
Strategy 패턴은 기본적으로 Composition
을 기본으로 한다.
그 말은, 전략 알고리즘을 통째로 변경하는 것이 목적이라는 말이다.
반면 Template method 패턴은 Inheritance
를 기본으로 한다.
Template
함수를 기본적으로 상속해서 사용하되 그 안에서 전략을 바꾼다.
그 말은, 기본적인 알고리즘은 중복되고 부분적 알고리즘만 변경된다는 말이다.
즉 코드의 중복을 피하기 위함에 더 초점이 맞추어져 있다.
장단점
기본적으로 Template method는 아래와 같은 장점이 있다.
OCP
원칙을 준수하기에 용이하다.- 중복되는 코드의 추상화로, 코드 중복이 줄어든다.
- 핵심 로직을 상위 클래스에서 다루기 때문에 유지 보수에 용이하다.
- 할리우드 원칙 : 고수준 구성요소에서 저수준 요소를 다루는 것
아래는 Template method의 단점이다.
- 이미 정해진 알고리즘의 골격에 의해 유연성이 떨어진다.
- 알고리즘이 복잡할수록 로직의 형태 유지가 어렵기도 하다.
- 추상 메서드가 많아지면 많아질수록 코드가 복잡해진다.