abstract class Player { // 추상 클래스(미완성 클래스)
abstract void play(int pos); // 추상 메서드
abstract void stop(); // 추상 메서드
}
// 추상 클래스는 상속을 통해 완성해야 객체 생성가능
class AudioPlayer extends Player {
void play(int pos) {
System.out.println(pos + "위치부터 play합니다.");
};
void stop() {
System.out.println("재생을 멈춥니다.");
}
}
public class PlayerTest {
public static void main(String[] args) {
// Player p = new Player();
// 추상클래스의 객체를 생성
// -> 에러발생. why? Player 클래스는
// 미완성 클래스이기에 객체생성 X
AudioPlayer ap = new AudioPlayer();
// AudioPlayer 클래스에서
// 구현부가 없는 추상 메서드인 void play()와
// void stop()을 재정의(Override) 해주었기 때문에
// 객체 생성 가능!
Player p = new AudioPlayer(); // 다형성
// Player는 리모컨, AudioPlayer와 연결되어 있다.
// Player는 추상 클래스이기 때문에
// play, stop 버튼만 있지 사용할 수는 없다.
// 하지만 Player를 상속 받은 AudioPlyaer는
// 내용이 완성된 메서드를 가진 완전한 클래스이다.
// 따라서 AudioPlayer 클래스 안에 있는
// 재정의된 play, stop 메서드를 통해 실행된다.
ap.play(100);
ap.stop();
}
}
public class Ex7_10 {
// 공통된 부분을 찾아 추상클래스를 만들어준다.
// Marine, Tank, Dropship은 공통적으로 움직이는 기능을 가지고 있다.
// Unit이라는 추상클래스에 void move()를 추상메서드로 만들어서 넣어주었다.
public static void main(String[] args) {
Unit[] group = { new Marine(), new Tank(), new Dropship() };
// Unit[] group = new Unit[3];
for (int i = 0; i < group.length; i++)
group[i].move(100, 200);
// 이제 반복문을 통해 Unit을 상속받는 자손 클래스인
// Marine, Tank, Dropship에서 미완성 메서드인
// move() 메서드를 구현하면
// 메인 메서드를 실행시켰을 때 각각의 자손 클래스에
// 공통으로 있는 move() 메서드가 실행된다.
// 추상클래스 Unit의 추상 메서드 void move()가 아니라
// 각 자손클래스에 있는 void 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) {
System.out.println("Marine[x=" + x + ",y=" + y + "]");
}
void stimPack() { /* 스팀팩을 사용한다. */ }
}
class Tank extends Unit { // 탱크
void move(int x, int y) {
System.out.println("Tank[x=" + x + ",y=" + y + "]");
}
void changeMode() { /* 공격모드를 변환한다. */ }
}
class Dropship extends Unit { // 드랍쉽
void move(int x, int y) {
System.out.println("Dropship[x=" + x + ",y=" + y + "]");
}
void load() { /* 유닛을 싣는다. */ }
void unload() { /* 유닛을 내린다. */ }
}