✔️상위 클래스에 템플릿에 해당하는 메소드가 있고 그 메소드 정의 안에는 추상메소드가 사용되고 있음 (상위 클래스: 뼈대 역할)
✔️그 추상 메소드를 하위 클래스가 구현함 (하위 클래스: 구체적 구현)
✔️상속을 이용해서 프로그램의 동작을 변경함.
✔️하위 클래스에서 알고리즘을 일일이 기술할 필요가 없음
✔️상위 클래스형의 변수에 하위 클래스의 어떠한 인스턴스를 대입해도 제대로 작동된다.
📌AbstractDisplay: display-> 템플릿 메소드.
display 메소드안에 open, print, close 세가지의 메소드가 사용됨 -> 추상 메소드
📌CharDisplay: open, print, close 구체적 구현
📌StringDisplay: open, print, close 구체적 구현
📌Main: 동작 테스트 클래스
display-> 구현됨,
open, print, close -> 구현안됨 : 하위 클래스에서 구현 (추상 메소드)
public abstract class AbstractDisplay{
public abstract void open();
public abstract void print();
public abstract void close();
public final void display(){
open();
for (int i=0; i<5; i++){
print(); //5번 호출
}
close(); //display 에서 구현되는 내용
}
}
open; "<<" 표시
print; 생성자에서 주어진 1문자를 표시
close; ">>" 표시
public class CharDisplay extends AbstractDisplay{
private char ch; //표시 문자
private int width ; 바이트 단위로 계산한 문자열 길이
public CharDisplay(char ch){
this.ch=ch; //생성자에 문자 기억
}
public void open(){ //구체적 구현
System.out.print("<<");
}
public void print(){
System.out.print(ch); //전달 받은 문자 출력
}
public void close(){ //구체적 구현
System.out.print(">>");
}
}
open(); "+---------+" 표시
print(); 생성자에서 주어진 문자열을 "|"와 "|" 사이에 표시
close(); "+---------+" 표시
public class StringDisplay extends AbstractDisplay{
private String str; //표시 문자
private int width; //문자열의 비트수
public StringDisplay(String str){
this.str=str; //생성자에 문자 기억
✅ this.width=string.getBytes().length; //바이트 단위 길이 필드에 저장
}
public void open(){ //구체적 구현
printLine();
}
public void print(){
System.out.print("|" + str +"|"); //전달 받은 문자 출력
}
public void close(){ //구체적 구현
printLine(); //문자열을 비트수 맞춰서 출력
}
public void printLine(){
System.out.print("+");
for(int i=0;i<width;i++){
System.out.print("-");
}
System.out.print("+");
}
}
public class main{
public static woid main(String[] args) {
AbstractDisplay.d1=new CharDisplay('H');
AbstractDisplay.d2=new StringDisplay('Hello world!');
d1.display(); //실제 동작은 하위 클래스 CharDisplay, StringDisplay 에서 한다.
d2.diaplay();
}
}