구현
// abstract이기 때문에 각 Unit에 move 메서드를 구현하도록 하는 강제 효과를 준다.
// 공통 부분 추출
abstract class Unit {
int x, y;
abstract void move(int x, int y);
void stop() { /* 현재 위치에 정지 */ }
}
// 코드의 중복이 제거되어 간결해짐
class Marine extends Unit {
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void stimPack() { /* 생략 */ }
}
class Tank extends Unit {
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void changeMode() { /* 생략 */ }
}
class Dropship extends Unit {
void move(int x, int y) { /* 지정된 위치로 이동 */ }
void load() { /* 생략 */ }
void unload() { /* 생략 */ }
}
사용
// 다형성 장점2(여러 종류의 객체를 배열로 다루기)
Unit[] group = new Unit[3];
group[0] = new Marine();
group[1] = new Tank();
group[2] = new Dropship();
// 아래와 같이 한 번에 선언 가능
// Unit[] group = { new Marine(), new Tank(), new Dropship() };
// 이동하는 방식이 다른 Marine, Tank, Dropship을 한 번에 이동시킴
for(int i = 0; i < group.length; i++)
group[i].move(100, 200); // 실제 구현된 메서드 호출!
GregorianCalendar cal = new GregorianCalendar(); // 구체적
Calendar cal = Calendar.getInstance(); // 추상적