7-31 추상 클래스
미완성 설계도(부족한 설계도)
미완성 메서드(추상 메서드)
둘 다 앞에 abstract를 붙여준다.
abstract가 클래스에 붙어있음으로
아 player라는 클래스에는 추상 메서드가 있겠구나.
- 추상 클래스는 다른 클래스 작성에 도움을 주기 위한 것.
Player p = new Player(); 미완성 설계도
- 상속을 통해 추상 메서드를 완성해야 인스턴스 생성 가능
AudioPlayer ap = new AudioPlayer(); 완성된 설계도. 인스턴스 생성 ok
Player p = new AudioPlayer(); 도 가능. 조상 : 자손이니까
Player는 추상 메서드인데 어떻게 호출이 가능한가?
추상 메서드가 호출되는 게 아니라
실제 구현된 AudioPlayer의 객체가 호출된다.
void play(int pos) {}
7-32 추상 메서드
- 미완성 메서드. 구현부(몸통, {})가 없는 메서드
abstract 리턴타입 메서드이름();
- 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우
추상 메서드 구현: 몸통 만들기 {}
abstract class AbstractPlayer extends Player {}
Player에게 상속받은 메서드 두 개 중 하나만 구현했다.
이럴 경우 클래스 앞에 abstract을 붙여줘야 한다.
두 개를 다 구현해줘야 하는데 한 개만 구현했으니 미완성 클래스다.
보이지는 않지만 상속받은 abstract void stop();이 있다.
추상 클래스는 상속을 받으면 다 구현해도 되고, 일부만 구현해도 된다.
필요에 따라서 선택하면 됨.
일부만 구현하는 경우에는 클래스 앞에 abstract를 붙여준다.
추상 메서드 play(), stop()에 abstract가 붙어있으면
사용하는 쪽에서 구현이 안되어 있으니까 상속을 받으면
내가 이 코드를 만들어서 이 설계도를 완성해야 되는구나 강제시키는 효과가 있다.
play(currentPos); < 추상 메서드 호출
메서드는 선언부만 알면 호출 가능하므로 추상 메서드도 호출 가능하다.
지금은 몸통이 없는데 나중에 상속을 통해서 자손이 완성
그때는 호출이 가능하다.
호출하는 코드가 있어도 지금은 호출 불가.
인스턴스 메서드는 객체생성 후 호출 가능한데
추상 클래스이므로 객체생성이 불가능하다.
추상 메서드 호출하려면
1. 상속을 통해 자손이 완성
2. 자손 객체 생성
그래서 void play() {
play(currentPos);
}
play, stop은 필수 기능이다.
Player라면 play, stop기능 필요하니까
몸통 적절하게 만들어서 구현해야 돼
몸통 대충 만들고 하면 안 되나?
abstract로 만들면 꼭 만들어야 한다고 강제성을 부여함.
근데 아무 코드도 없는 {}를 만들면, 추상 클래스가 아닌 걸로 하면
이걸 객체 만들어서 사용할 거다.
사용하면서 이게 왜 동작을 안 하지 생각할 수 있다.
그래서 abstract를 붙이는 것이다.
Player 리모컨에 play, stop 버튼 두 개가 있는 거다.
실제 가리키는 객체는 AudioPlayer < 얘는 기능을 다 가지고 있다.
play(); stop();
Player ap = new AudioPlayer();
리모컨이 아무리 추상 메서드라고 해도
실제 연결된 것은 구현된 메서드가 실행된다.
실제 객체가 가지고 있는 play() 메서드가 실행된다.
Player에 play가 호출되는 것이 아니라
실제 호출되는건 AudioPlayer의 play가 호출된다.
리모컨 타입하고 상관없다.
AudioPlayer 클래스에서 stop()을 구현하지 않으면 빨간 줄이 뜬다.
왜 뜨냐면 안 보이지만 실제 Player로부터 play(), stop()을
상속받았기 때문에 둘 다 구현해 줘야 한다.
이럴 때
1. stop()을 구현해주던지
2. AudioPlayer클래스 앞에 abstract class AudioPlayer라고 해주던지 해야 한다.
이럴 경우 AudioPlayer는 객체 생성 불가
코드
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(); // 추상 클래스의 객체를 생성
// AudioPlayer ap = new AudioPlayer();
Player ap = new AudioPlayer(); // 다형성
ap.play(100);
ap.stop();
}
}
'프로그래밍 언어 > 자바의 정석 기초편' 카테고리의 다른 글
자바의 정석 기초편 ch7-33,34 추상클래스의작성2 (0) | 2022.10.24 |
---|---|
자바의 정석 기초편 ch7-33,34 추상클래스의 작성1 (0) | 2022.09.30 |
자바의 정석 기초편 ch7-29,30 여러 종류의 객체를 배열로 다루기 (0) | 2022.09.16 |
자바의 정석 기초편 ch7-27,28 매개변수 다형성 (0) | 2022.09.05 |
자바의 정석 기초편 ch7-26 instanceof 연산자 (0) | 2022.09.03 |