상위 클래스에서 알고리즘의 기본 구조를 정의하고,
하위 클래스에서 일부 단계를 구체적으로 구현하는 패턴
세부 단계에서 유연하게 동작을 변경할 수 있어 코드의 재사용성과 유연성이 높아집니다.
부모 클래스에서 알고리즘의 골격을 정의, 부모 클래스에서 해당 알고리즘의 구조를 변경 X
자식 클래스들이 알고리즘의 특정 단계들을 오버라이드(재정의) 할 수 있도록 하는
행동 디자인 패턴이다.
장점과 단점
장점
- 코드 재사용성
- 유연성
- 변경 용이성
단점
- 상속의 제한 (다중 상속 불가능)
- 알고리즘이 복잡해질 가능성 (알고리즘 구조가 복잡할수록 하위 클래스 구현이 어려워질수 있음)
코드 예시
- 수업 진행의 틀을 제공하는 인터페이스
public interface TeacherAble {
void 수업하기();
}
- 선생님들의 수업 진행 과정 틀을 제공하는 상위 클래스
public abstract class Teacher implements TeacherAble {
protected void 입장하기(){
System.out.println("입장하기");
}
protected void 출석부르기(){
System.out.println("출석부르기");
}
protected abstract void 강의하기();
protected void 퇴장하기(){
System.out.println("퇴장하기");
}
@Override
public void 수업하기() {
입장하기();
출석부르기();
강의하기();
퇴장하기();
}
}
- 입장하기, 출석부르기, 퇴장하기는 모든 선생님들의 수업하기 속 공통 동작이기 때문에 해당 상위 클래스에서 정의내리고 있습니다. 강의하기 메서드는 각 선생님들이 가르치실 과목이 다르기 때문에 각각의 선생님 클래스에서 역할을 구체적으로 구현합니다.
- 과목 별 선생님들의 클래스
//Flutter 과목 선생님 클래스
public class FlutterTeacher extends Teacher{
@Override
protected void 강의하기() {
System.out.println("플러터 강의하기");
}
}
-----------------------------------------------
//HTML 과목 선생님 클래스
public class HTMLTeacher extends Teacher {
@Override
protected void 강의하기(){
System.out.println("HTML 수업하기");
}
}
-----------------------------------------------
//JAVA 과목 선생님 클래스
public class JavaTeacher extends Teacher{
@Override
protected void 강의하기() {
System.out.println("자바 강의하기");
}
}
-----------------------------------------------
//Python 과목 선생님 클래스
public class PythonTeacher extends Teacher {
@Override
protected void 강의하기() {
System.out.println("파이썬 강의하기");
}
}
- 상위 클래스에서 정의되지 않은 “강의하기 메서드”를 각각의 선생님 하위 클래스에서 구체적으로 정의하는 코드들 입니다.
- main 클래스
public class App {
public static void main(String[] args) {
JavaTeacher t1 = new JavaTeacher();
t1.수업하기();
System.out.println();
PythonTeacher t2 = new PythonTeacher();
t2.수업하기();
System.out.println();
HTMLTeacher t3 = new HTMLTeacher();
t3.수업하기();
FlutterTeacher t4 = new FlutterTeacher();
t4.수업하기();
/*
t1.입장하기();
t1.출석부르기();
t1.자바강의하기();
t1.퇴장하기();
*/
}
}
- 결과
((자바 선생님)) 입장하기 출석부르기 자바 강의하기 퇴장하기 ------------ ((파이썬 선생님)) 입장하기 출석부르기 파이썬 강의하기 퇴장하기 ------------ ((HTML 선생님)) 입장하기 출석부르기 HTML 수업하기 퇴장하기 ------------ ((플러터 선생님)) 입장하기 출석부르기 플러터 강의하기 퇴장하기 ------------
참고 문헌
Share article