본문 바로가기

Java

추상 클래스, 추상 메서드

1) 추상 클래스란?

- 추상 클래스는 미완성 설계도 혹은 미완성 메소드를 갖고 있는 클래스입니다.

  즉, 추상 메서드를 갖고 있으면 추상 클래스입니다. 

  abstract 키워드가 없으면 해당 클래스가 추상 메서드를 갖는지 아닌지 알 수 없습니다. 

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 ap = new AudioPlayer();

 

2) 추상 메서드란?

- 추상 메서드란 미완성 메서드, 즉 구현부가 없는 메서드입니다. 

  추상 메서드는 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우 사용합니다. 

abstract 리턴타입 메서드이름();

- 추상 클래스를 상속 받아서 모든 추상 메소드를 구현하면, 더 이상 추상 클래스가 아니지만,

  하나의 추상 메소드라도 구현하지 않으면, 여전히 추상 클래스입니다. 

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){ /* 내용 생략 */ };
}

 

3) 추상 메서드의 실질적인 예

- PlayerTest라는 클래스를 만들고, Player를 만듭니다. 

  이 때, Player ap = new 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();
    }

}

 

참고

남궁성 자바의 정석