[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();
    }
}