여러 클래스에서 공통으로 사용하는 메서드를 템플릿(틀)화 하여 상위 클래스에서 정의하고, 하위 클래스마다 세부 동작 사항을 다르게 구현하는 패턴
특징
- 변하지 않는 기능(템플릿)은 상위 클래스에서 만들어두고, 변경 및 확장할 기능은 하위 클래스에서 만들도록 함
- 여러 단계 중 하나 이상의 단계가 추상 메소드로 정의되고 상위 클래스에서 구현됨
- 상위의 메소드 실행 동작 순서 고정, 세부 실행 내용은 다양화
- 추상화와 상속, 오버라이드, 동적 바인딩 활용
- 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 하위 클래스에서 재정의할 수 있음
예제
- interface(TeacherAble)을 받아서 구현하는 추상 클래스(Teacher)
- 추상 클래스(Teacher)를 상속받는 하위 클래스(구현 클래스)
- JavaTeacher
- PythonTeacher
- HtmlTeacher
- FlutterTeacher
- App 클래스의 main에서 구현 클래스 호출하고 실행
package ch05.teacher;
public interface TeacherAble {
// interface니까 (interface는 new 불가능)
// 메소드 생성할 때 public abstract는 생략해도됨
// interface의 추상은 자식들이 동일 메소드를 무조건 구현해야함
// 추상클래스의 추상은 자식들이 동일 메소드를 구현하도록 권유
void 수업하기();
}
package ch05.teacher;
// 추상 클래스(abstract)
// 인터페이스 상속(implements TodaAble)
public abstract class Teacher implements TeacherAble {
protected void 입장하기() {
System.out.println("입장하기");
}
protected void 출석부르기() {
System.out.println("출석부르기");
}
// 이 클래스를 상속받는 클래스들에 오버라이드 실행될것
// 자식 클래스에서 활성화되고 부모 클래스에서 무효화됨 => 오버라이드, 동적바인딩
protected abstract void 강의하기();
protected void 퇴장하기() {
System.out.println("퇴장하기");
}
// interface(TodaAble)의 메소드(수업하기) 오버라이드
// 캡슐화
public void 수업하기() {
입장하기();
출석부르기();
강의하기();
퇴장하기();
}
}
package ch05.teacher;
// Teacher(추상클래스) 상속
// Teacher가 interface(TodaAble) 상속해놔서
// interface의 메소드도 추상클래스에 포함되어있음
public class JavaTeacher extends Teacher{
// Teacher 클래스의 추상메소드(강의하기)
@Override
protected void 강의하기() {
System.out.println("자바 강의하기");
}
}
package ch05.teacher;
// Teacher(추상클래스) 상속
// Teacher가 interface(TodaAble) 상속해놔서
// interface의 메소드도 추상클래스에 포함되어있음
public class PythonTeacher extends Teacher{
// Teacher 클래스의 추상메소드(강의하기)
@Override
protected void 강의하기() {
System.out.println("파이썬 강의하기");
}
}
package ch05.teacher;
// Teacher(추상클래스) 상속
// Teacher가 interface(TodaAble) 상속해놔서
// interface의 메소드도 추상클래스에 포함되어있음
public class HtmlTeacher extends Teacher{
// Teacher 클래스의 추상메소드(강의하기)
@Override
protected void 강의하기() {
System.out.println("HTML 강의하기");
}
}
package ch05.teacher;
// Teacher(추상클래스) 상속
// Teacher가 interface(TodaAble) 상속해놔서
// interface의 메소드도 추상클래스에 포함되어있음
public class FlutterTeacher extends Teacher{
// Teacher 클래스의 추상메소드(강의하기)
@Override
protected void 강의하기() {
System.out.println("플러터 강의하기");
}
}
package ch05;
import ch05.teacher.FlutterTeacher;
import ch05.teacher.HtmlTeacher;
import ch05.teacher.JavaTeacher;
import ch05.teacher.PythonTeacher;
public class App {
public static void main(String[] args) {
JavaTeacher t1 = new JavaTeacher();
// JavaTeacher에서 캡슐화시킨것을 불러옴
// 순서를 틀릴일도, 호출할 메소드를 헷갈릴 일도 없음
t1.수업하기();
PythonTeacher t2 = new PythonTeacher();
// PythonTeacher에서 캡슐화시킨것을 불러옴
t2.수업하기();
HtmlTeacher t3 = new HtmlTeacher();
// HtmlTeacher에서 캡슐화시킨것을 불러옴
t3.수업하기();
FlutterTeacher t4 = new FlutterTeacher();
// FlutterTeacher에서 캡슐화시킨것을 불러옴
t4.수업하기();
}
}Share article