abstract 리턴타입 메서드이름(매개변수); // 메서드 바디{} 가 없음
💡 메서드 바디가 없는 이유 : 하위 클래스마다 다르게 구현해야 하기 때문에
💡 인스턴스 메서드는 인스턴스 생성 후 호출이 가능하기 때문에 추상 메서드를 호출해도 문제가 발생하지 않는다. 왜? 인스턴스 생성은 추상 클래스를 상속 받은 하위 클래스로부터 생성될 것이기 때문에
abstract class Player {
abstract void play();
}
Player p = new Player(); // 에러 발생. 인스턴스 생성 불가능
abstract class Player {
abstract void play();
}
class AudioPlayer extends Player {
void play() {...}
}
AudioPlayer a = new AudioPlayer; // 인스턴스 생성 가능
💡 추상 클래스를 상속 받은 하위 클래스는 추상 클래스가 가지고 있는 메서드 모두를 사용해도 되고 일부만 사용해도 된다.
단, 하나라도 추상 메서드 그대로 포함한다면 그 클래스는 추상 클래스이다.
abstract class Player {
abstract void play(int pos);
abstract void stop();
}
class AudioPlayer extends Player {
void play(int pos) {return pos;}
}
// 에러 발생! AudioPlayer는 Player를 상속 받은 클래스라 Player의 멤버를 가지고 있음.
stop()메서드를 구현하지 않았기 때문에 stop()메서드는 여전히 추상메서드임!
💡 추상 클래스와 인터페이스의 차이
추상 클래스 : 일반 클래스가 추상 메서드를 가지고 있는 것 (일부만 구현 X)
인터페이스 : 추상메서드만 있는 것(빈 깡통)
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름(매개변수);
}
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상 메서드를 모두 구현해야 한다.
}