1. 예제 프로그램
<AbstractDisplay.java>
package ch03.Sample;
// 추상 클래스 AbstractDisplay
public abstract class AbstractDisplay {
// 하위 클래스에 구현을 맡기는 추상메소드(1)
public abstract void open();
// 하위 클래스에 구현을 맡기는 추상메소드(2)
public abstract void print();
// 하위 클래스에 구현을 맡기는 추상메소드(3)
public abstract void close();
// 추상 클래스에서 구현하고 있는 메소드 display
// 전반적인 흐름(메시지 호출 순서)를 결정한다.
public final void display() {//템플릿 메소드
// 우선 open하고...
open();
// 5번print를 반복하고...
for (int i = 0; i < 5; i++) {
print();
}
// 마지막으로 close한다.
close();
}
}
<CharDisplay.java>
package ch03.Sample;
// CharDisplay는 AbstractDisplay의 하위 클래스
public class CharDisplay extends AbstractDisplay {
// 표시해야 할 문자를 저장한다.
private char ch;
public CharDisplay(char ch) { // 생성자에서 넘어온 문자ch를
this.ch = ch; // 필드(속성)에 기억해 둔다.
}
// 상위 클래스에서는 추상메소드였다. 여기서 오버라이드 해서 구현.
public void open() {
System.out.print("<<"); // 시작 문자열로서 "<<"를 표시한다.
}
// print메소드로 여기서 구현한다. 이것이 display에서 반복해서 호출된다.
public void print() {
System.out.print(ch); // 필드에 기억해둔 문자 1개를 표시
}
// close메소드도 여기서 구현
public void close() {
System.out.println(">>"); // 종료문자열 ">>"를 표시.
}
}
<StringDisplay.java>
package ch03.Sample;
// StringDisplay도 AbstractDisplay의 하위 클래스
public class StringDisplay extends AbstractDisplay {
private String string; // 표시해야 할 문자열을 저장하는 변수
private int width; // 바이트 단위로 계산한 문자열의 폭
public StringDisplay(String string) { // 생성자에서 넘어온 문자열 string을
this.string = string; // 필드에 기억
// 그리고 바이트 단위의 폭도 필드에 기억해 두고 나중에 사용한다.
this.width = string.getBytes().length;
//this.width = string.length();
// System.out.println("string.getBytes().length = " + string.getBytes().length);
// 아래 문장은 문자열의 갯수를 출력한다.
// System.out.println("string.length() = " + string.length());
}
public void open() { // 오버라이드해서 정의한 open메소드
printLine(); // 이 클래스의 메소드 printLine에서 선을 그리고 있다.
}
public void print() { // print메소드는
// 필드에 기억해 둔 문자열의 전후에 "|"를 붙여서 표시.
System.out.println("|" + string + "|");
}
public void close() { // close메소드는
// open과 같이 printLine메소드에서 선을 그리고 있다.
printLine();
}
// open과 close로부터 호출되는 printLine메소드다.
// private이기 때문에 이 클래스 내에서만 사용된다.
private void printLine() {
// 사각틀의 모퉁이를 표현하는 "+"마크를 표시.
System.out.print("+");
for (int i = 0; i < width; i++) { // width개의 "-"표시해서
System.out.print("-"); // 사각틀로서 이용한다.
}
System.out.println("+"); // 사각틀의 모퉁이를 표현하는 "+"마크를 표시
}
}
<Main.java>
package ch03.Sample;
public class Main {
public static void main(String[] args) {
AbstractDisplay d1; //변수 선언
d1 = new CharDisplay('a'); //객체 생성
d1.display();
d1 = new StringDisplay("k");
d1.display();
d1 = new StringDisplay("김");
d1.display();
}
}