추상클래스, 추상 메서드
- 미완성(부족한) 설계도
- 미완성 메서드를 갖고 있는 클래스
abstract class Player { //추상클래스(미완성 클래스)
abstract void play(int pos); //추상메서드(몸통{}이 없는 미완성 메서드)
abstract void stop(); //추상메서드
}
- 다른 클래스 작성에 도움을 주기 위한 것이다. 인스턴스 생성이 불가능하다.
Player p = new Player(); //에러. 추상 클래스의 인스턴스 생성 불가
- 상속을 통해 추상 메서드를 완성해야 인스턴스 생성이 가능하다.
class AudioPlayer extends Player {
void play(int pos); { /* 생략 */}
void stop(); { /* 생략 */}
}
AudioPlayer a = new AudioPlayer (); //가능
추상 메서드(abstract method)
- 미완성 메서드. 구현부( {} )가 없는 메서드
❓어떨 때 쓰는가?
→ 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우
abstract class Player { //추상클래스
abstract void play(int pos); //추상메서드
abstract void stop(); //추상메서드
}
class AudioPlayer extends Player {
void play(int pos); { /* 생략 */} //추상메서드 구현
void stop(); { /* 생략 */} //추상메서드 구현
}
abstract class AbstractPlayer extends Player {
void play(int pos) { /* 생략 */} //추상메서드 구현
}
AbstractPlayer는 메서드 2개 중 1개만 구현했다.
그럼 미완성이기 때문에 abstract를 붙여줘야 한다.
안 붙이면 컴파일에러 발생!
추상 클래스 + 다형성 예제
abstract class Player { //추상클래스
abstract void play(int pos); //추상메서드
abstract void stop(); //추상메서드
}
class AudioPlayer extends Player {
void play(int pos) {
System.out.println(pos);
}
void stop() {
System.out.println("stop()");
}
}
public class AbstractTest {
public static void main(String[] args) {
// Player p = new Player(); //에러. 추상 클래스의 객체를 생성할 수 없음.
Player p = new AudioPlayer(); //다형성
p.play(1000);
p.stop();
}
}
`Player p = new Player();` 는 불가능하다.
→ 추상 클래스의 인스턴스는 생성할 수 없다.
`Player p = new AudioPlayer();` 는 가능하다.
→ 실제 객체는 AudioPlayer 클래스기 때문에!
예제코드
추상 클래스라고 꼭 추상 메서드만 존재해야 되는 것은 아니다.
abstract class Player { //추상클래스
abstract void play(int pos); //추상메서드
void stop() {
System.out.println("stop()");
}
}
class AudioPlayer extends Player {
void play(int pos) {
System.out.println(pos);
}
}
public class AbstractTest {
public static void main(String[] args) {
// Player p = new Player(); //에러. 추상 클래스의 객체를 생성할 수 없음.
Player p = new AudioPlayer(); //다형성
AudioPlayer a = new AudioPlayer();
p.play(1000);
p.stop();
a.play(2000);
a.stop();
}
}
결과
추상클래스의 장점
- 관리가 용이하다.
→ 추상 클래스라는 설계도를 기반으로 구현하기 때문에
- 변경에 유연하다.
→ 설계도를 수정해주면 된다.
- 중복코드를 방지한다.
→ 클래스를 만들어 다 구현하지 않고 그저 상속받으면 된다.
abstract class Person{
void eat() { System.out.println("eat1()"); }
abstract void sleep();
abstract void talk();
}
class Park extends Person{
void sleep() { System.out.println("sleep1()"); }
void talk() { System.out.println("talk1()"); }
}
class Lee extends Person{
void sleep() { System.out.println("sleep2()"); }
void talk() { System.out.println("talk2()"); }
}
class Kim extends Person{
void sleep() { System.out.println("sleep3()"); }
void talk() { System.out.println("talk3()"); }
}
'📝 끄적끄적 > 🖥️ 자바의 정석' 카테고리의 다른 글
[자바의 정석] - 인터페이스(interface) (0) | 2023.09.26 |
---|---|
[자바의 정석] - 다형성 (0) | 2023.09.25 |
[자바의 정석] 참조변수의 형변환, instanceof 연산자 (0) | 2023.09.24 |
[자바의 정석] 제어자, 캡슐화 (0) | 2023.09.24 |
[자바의 정석] 상속, 참조변수 super, 생성자 super() (0) | 2023.09.23 |
[자바의 정석] 생성자, 변수/멤버 변수의 초기화 (0) | 2023.09.22 |