/ JAVAJUNGSUK

Ch7-31~32. 추상 클래스

자바의 정석 기초편

0. 목차



Chapter7. 객체지향 프로그래밍Ⅱ

Ch7 - 31. 추상 클래스

Ch7 - 32. 추상 메서드



Ch7 - 31. 추상 클래스


▶ 추상 클래스(abstract class)란?

▷ 미완성 설계도
▷ 미완성 메서드를 갖고 있는 클래스
  • 추상 메서드
    • 구현부{}가 없는 미완성 메서드
    • abstract를 붙임
      abstract void play(int pos);
  • 추상 클래스 : 추상 메서드를 갖고 있는 클래스
      abstract class Player {
          abstract void play(int pos);
      }
    
▷ 다른 클래스 작성에 도움을 주기 위한 것
▷ 인스턴스 생성 불가
  • 추상 클래스 = 미완성 설계도 → 제품 설계 불가
      Player p = new Player(); // 에러! 추상 클래스의 인스턴스 생성 불가
    
▷ 상속을 통해 추상 메서드 완성시킨 후, 인스턴스 생성 가능
class AudioPlayer extends Player { // 미완성 설계도를 상속 → 완성 설계도
    void play(int pos) { } // 추상 메서드 구현, 구현부{}를 만들어 줌
    void stop() { } // 추상 메서드 구현
}

AudioPlayer ap = new AudioPlayer(); // 인스턴스 생성 가능



Ch7 - 32. 추상 메서드


▶ 추상 메서드(abstract method)란?

▷ 미완선 메서드
▷ 구현부{}가 없는 메서드

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 { // 추상 클래스 상속 → 완전한 클래스?? : nope! 미완성 클래스 그래서 abstract 붙임
  abstract void play(int pos) { } // 상속받은 추상 클래스의 추상메서드 2개 중 하나만 구현 → 미완성 클래스가 됨
}

▶ 추상 메서드 호출 가능

▷ 호출 시, 선언부만 필요
abstract class Player {
	boolean pause; // 추상 클래스 내 iv, 일시정지
	int currentPos; // 추상 클래스 내 iv, 현재 paly 위치
	
	Player() { // 추상 클래스도 생성자有
		pause = false;
		currentPos = 0;
	}
	
	abstract void play(int pos); // pos에서 play!
	abstract void stop(); // stop!

	void play() { // 인스턴스 메서드
		play(currentPos); // 추상 메서드 호출
	}
}
  • 인스턴스 메서드 사용법
    • 클래스 객체 생성
    • 추상 클래스를 객체 생성하려면 상속 해야 함
  • 추상 메서드 사용법
    • 자손 객체가 추상 클래스 상속
    • 자손 객체가 구현부{} 생성
  • 인스턴스 메서드나 추상 메서드나 객체 생성 필요
  • 그러나 추상 클래스에서는 객체 생성이 불가
  • 결론 : 인스턴스 메서드 play에 있는 추상 메서드 play(currentPos)를 사용하려면?
    1. 추상 클래스를 온전히 상속 받는 자손 생성
    2. 자손 클래스에서 조상 클래스의 모든 메서드의 구현부{} 생성
    3. 자손 클래스 객체 생성
    4. 객체.Play(currentPos) 호출하여 사용

dvdPlayer든 어떤 Player든 간에 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"); }
}

class Test {
	public static void main(String[] args) {
		AudioPlayer ap = new AudioPlayer();
		ap.play(100);
		ap.stop();
	}
}

// console
100'부터 시작
stop
▷ 객체 생성할 때, 실제 생성되는 객체 = AudioPlayer
▷ 리모콘은 AudioPlayer, Player 둘 중 아무거나 상관 없음
AudioPlayer ap = new AudioPlayer();
Player ap = new AudioPlayer(); // 다형성