[Java] 11. 추상클래스(Abstract Class)
상속 개념이 자식클래스에서 부모클래스를 사용하는 게 의도라면, 추상화 개념은 기존의 클래스의 공통 부분을 추려내서 부모클래스를 만드는 것이다.
1. 추상화란?
클래스를 설계도에 비유한다면 추상클래스는 미완성 설계도에 비유 한다. 추상 클래스는 abstract
예약어가 붙으며, 무엇을 구현을 할 것이다.
라고 설계하는 개념으로
선언만 하며 구현은 자식클래스에서 한다.
//플레이어의 실행, 정지 기능을 미완성 설계도
abstract class Player {
//실햍
public abstract void play();
//정지
public abstract void stop();
}
Player의 실행, 정지 기능을 미완성 설계도로 Mp3 //실행, 정지 기능을 구현이 필요하다는 것이다.
추상(抽象)은 사물을 정확하게 이해하기 위해서는 사물이 지니고 있는 여러 가지 측면 가운데서 특정한 측면만을 가려내어 포착하는 것이다.
상속 개념이 자식클래스에서 부모클래스를 사용하는 게 의도라면, 추상화 개념은 기존의 클래스의 공통 부분을 추려내서 부모클래스를 만드는 것이다.
- 추상화 : 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
- 구체화 : 상속을 통해 클래스를 구현, 확장하는 작업
2. 추상클래스 예제 코드
AbstractPlayer 추상클래스의 실행, 정지 기능 등이 미완성 설계도로 AbstractPlayer 클래스를 상속 받아서
자식클래스에서 구현하라는 의미이다.
/**
* Player 의 고유 공통 기능을 추상메서드로 설계
* - 공통적으로 사용할 수 있는 필드와 메서드를 설계하
* - 추상클래스는 상위 클래스로서 하위 클래스 메서드에서 구현
* - 추상클래스를 상속 받은 클래스에서 메서드를 구현하지 않으면 에러가 발생
*/
abstract class AbstractPlayer {
/**
* 10초 전
*/
public abstract void prevPlay();
/**
* 실행
*/
public abstract void play();
/**
* 정지
*/
public abstract void stop();
/**
* 10초 후
*/
public abstract void nextPlay();
public void turnOn() {
System.out.println("플레이어를 키다.");
}
public void turnOff() {
System.out.println("플레이어를 끄다.");
}
}
/**
* Mp3Player 기능 구현
* - 상속 받은 AbstractPlayer 추상 클래스에서 선언(설계) 된 기능들을 구현한다.
*/
class Mp3Player extends AbstractPlayer {
@Override
public void prevPlay() {
//기능 구현
System.out.println("음성 10초 전 이동");
}
@Override
public void play() {
//기능 구현
System.out.println("음성 플레이");
}
@Override
public void stop(){
//기능 구현
System.out.println("음성 정지");
}
@Override
public void nextPlay() {
//기능 구현
System.out.println("음성 10초 후 이동");
}
}
/**
* VideoPlayer 기능 구현
* - 상속 받은 AbstractPlayer 추상 클래스에서 선언(설계) 된 기능들을 구현한다.
*/
class VideoPlayer extends AbstractPlayer {
@Override
public void prevPlay() {
//기능 구현
System.out.println("영상 10초 전 이동");
}
@Override
public void play() {
//기능 구현
System.out.println("영상 플레이");
}
@Override
public void stop(){
//기능 구현
System.out.println("영상 정지");
}
@Override
public void nextPlay() {
//기능 구현
System.out.println("영상 10초 후 이동");
}
}
/**
* 스마트TV 리모컨 기능
*/
public class ExSmartTVByPlayer {
public static void main(String... args) {
AbstractPlayer player = null;
player = new VideoPlayer();//다형성
player.play();
player.stop();
player = new Mp3Player();//다형성
player.play();
player.stop();
}
}