추상클래스란? 미완성 설계도, 미완성 메서드를 갖고 있는 클래스
abstract class Player{ // 추상클래스(미완성 클래스)
abstract void play(int pos); // 추상메서드(몸통{}이 없는 미완성 메서드)
abstract void stop(); // 추상메서드
}
Player p = new Player(); // (에러)추상 클래스의 인스턴스 생성 불가
상속을 통해 자손 클래스에서 추상 메서드, 즉 몸통(내용)을 구현하게 강제한다.
WHY? 미완성 메서드가 있을 시, 객체 생성이 안되기 때문에 꼭 필요하고 필수적인 메서드는 작성해야 한다 알려주는 용도!
abstract class Player { // 추상클래스
abstract void play(int pos); // 추상메서드
abstract void stop(); // 추상메서드
}
// 추상클래스인 Player를 상속받아 내용(몸통 {})을 만들어 준 완전클래스
class AudioPlayer extends Player {
void play(int pos) { /* 내용 생략 */ } // 추상메서드를 구현
void stop() { /* 내용 생략 */ } // 추상메서드를 구현
}
// 추상클래스인 Player를 상속받아 void play() 추상메서드는 구현하였으나,
// void stop()은 구현하지 않았으므로(보이지는 않지만 void stop()은 생략되어 있음)
// AbstractPlayer는 여전히 추상클래스(미완성 클래스)이다. 따라서 abstract를 클래스 앞에
// 표기해서 추상클래스임을 알려주어야 한다.
abstract class AbstractPlayer extends Player {
void play(int pos) { /* 내용 생략 */ } // 추상메서드를 구현
// void stop();
}
abstract class Player {
boolean pause; // 일시정지 상태를 저장하기 위한 변수
int currentPos; // 현재 Play되고 있는 위치를 저장하기 위한 변수
Player() { // 추상클래스도 생성자가 있어야 한다.
pause = false;
currentPos = 0;
}
/** 지정된 위치(pos)에서 재생을 시작하는 기능이 수행하도록 작성되어야 한다. */
abstract void play(int pos); // 추상메서드
/** 재생을 즉시 멈추는 기능을 수행하도록 작성되어야 한다. */
abstract void stop(); // 추상메서드
void play() {
play(currentPos); // 추상메서드를 사용할 수 있다.
// 메서드는 선언부만 알면 호출가능하므로 추상메서드도 호출 가능!!!
}