추상 클래스
미완성 설계도, 미완성 메서드를 갖고 있는 클래스이다.
abstract class Player {
abstract void play (int post);
abstract void stop ();
}
다른 클래스 작성에 도움을 주기 위한 것이며, 인스턴스 생성이 불가능하다.
* 미완성 설계도이기 때문에 제품 생산이 불가능하다.
Player p = new Player(); // 에러. 추상메서드의 인스턴스 생성 불가
상속을 통해 추상 메서드를 완성해야 인스턴스가 생성이 가능하다.
class AudioPlayer extends Player {
void play (int pos) { ... }
void stop () { ... }
}
AudioPlayer ap = new AudioPlayer();
Player p = new AudioPlayer(); // 조상 타입이기 때문에 사용 가능.
Player 은 버튼만 제공하고, 실제 구현된 AudioPlayer 의 메서드가 호출된다.
https://skylarcoding.tistory.com/251
추상 메서드
미완성인 메서드이다. 구현부 (몸통) {} 가 없는 메서드이다.
추상 메서드는 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용하게 된다.
abstract 리턴타입 메서드이름(); // 구현부 {} 가 없다.
추상 클래스를 자손이 상속받아 추상 메서드의 구현부를 구현해야 한다. (추상메서드를 구현)
abstract class Player {
abstract void play(int pos);
abstract void stop();
}
위 추상 메서드를 상속받아 구현부를 구현하여 완전 클래스를 생성한다.
class AudioPlayer extends Player {
void play(int pos) { .. 구현부 .. }
void stop() { .. 구현부 .. }
}
조상 추상메서드 두 개 중 한개만 구현한 경우 미완성이기 때문에 abstract 를 붙여주었다.
abstract 를 안 붙여줄 경우 에러가 발생한다.
abstract class AbstractPlayer extends Player {
void play (int pos) { .. 구현부 .. }
}
추상 클래스 내에서 인스턴스 메서드가 추상메서드를 사용할 수 있다.
인스턴스 메서드는 객체 생성 후 사용이 가능하고, 추상클래스는 객체생성이 불가하기 때문이다.
결국 상속 받아 객체에서 호출할 경우 추상메서드의 구현부는 존재하고 있을 것이기 때문.
abstract class Player {
boolean pause;
int currentPos;
Player() { // 생성자
pause = false;
currentPos = 0;
}
// ~~ 한 기능이 수행되도록 작성되어야 한다.
abstract void play (int pos); // 추상 메서드
abstract void stop ();
void play () { // 인스턴스 메서드
play(currentPos); // 추상 메서드를 사용할 수 있다.
}
}
추상 클래스의 작성
기존 클래스의 공통 부분을 뽑아 추상클래스를 만든다.
추상 클래스로 작성하지 않을 경우, 미완성 된 클래스 임에도 바로 가져다 쓰는 등의 문제가 발생할 수 있다.
참고자료
자바의 정석 3rd Edition
자바의 정석 - 기초 추상 클래스, 추상 메서드 동영상 강의
https://www.youtube.com/watch?v=9VgkoVFZvyk&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=86