7-31~32 추상 클래스(abstract class)

oyeon·2020년 12월 31일
0

(완)객체지향 개념

목록 보기
31/37

추상 클래스(abstract class)

  • 미완성 설계도. 추상(미완성) 메서드를 갖고 있는 클래스
abstract class Player {		 // 추상 클래스(미완성 클래스)
    abstract void play(int pos); // 추상 메서드(몸통이 없는 미완성 메서드)
    abstract void stop();	 // 추상 메서드
}
  • 다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가
Player p = new Player();	// 에러. 추상 클래스의 인스턴스 생성 불가
  • 상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능
    (※ 모든 추상 메서드를 구현해야만 한다. 1개라도 덜 구현되면 abstract class 이다!! 덜 구현된 메서드를 구현하던지, abstract class 선언을 해야 함)
class AudioPlayer extends Player{
    void play(int pos) { /* 내용 생략 */ }	// 추상 메서드를 구현
    void stop()	{ /* 내용 생략 */ }		// 추상 메서드를 구현
}

AudioPlayer ap = new AudioPlayer();	// OK
Player ap = new AudioPlayer();		// OK. 다형성
  • 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함.
abstract class AudioPlayer extends Player{
    void play(int pos) { /* 내용 생략 */ }	// 추상 메서드를 구현
    // abstract void stop();	 // 보이지 않지만 상속의 결과로 생략되어 있는 것
}

추상 메서드(abstract method)

  • 미완성 메서드. 구현부(몸통, {})가 없는 메서드
abstract 리턴타입 메서드이름();
  • 꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우
  • 추상 메서드 호출 가능(호출할 때는 선언부만 필요)
abstract class Player {
    boolean pause;	// 일시정지 상태를 저장하기 위한 변수
    int currentPos;	// 현재 Play되고 있는 위치를 저장하기 위한 변수
    
    Player() {		// 추상 클래스도 생성자가 있어야 한다.
    	pause = false;
        currentPos = 0;
    }
    abstract void play(int pos);	// 추상 메서드
    abstract void stop();		// 추상 메서드
    // 추상 메서드는 구현부가 없으므로 Player를 상속받는
    // 자손 Player 들이 play랑 stop을 반드시 구현해야 하는 강제 효과가 있음
    
    void play(){
    	play(currentPos);	// 비록 구현되지 않았지만 추상 메서드를 사용할 수 있다!!
        // 인스턴스 메서드는 객체 생성 후 호출 되므로 위 코드가 있어도 호출되지 못한다.
        // 언제 호출되는가? 
        // 1. 상속을 통해 자손이 몸통 완성 
        // 2. 자손 객체 생성(DvdPlayer d = new DvdPlayer();) 
        // 3. 인스턴스 메서드 호출(d.play();)
    }
}
profile
Enjoy to study

0개의 댓글