Day 31

ChangWoo·2023년 5월 6일
0

자바의 정석

목록 보기
31/71

ch 7-31,32 추상 클래스, 추상 메서드

추상 클래스 (abstract class)

미완성 설계도. 미완성 메서드를 갖고 있는 클래스

abstract class Player {	 // 추상클래스(미완성클래스)
	abstract void play(int pos);	// 추상메서드(몸통{}이 없는 미완성 메서드)
    abstract void stop();			// 추상메서드 (=미완성메서드)
}
  • 미완성클래스와 미완성메서드는 {}이 없으므로 abstract를 붙여줘야 한다.
    다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가.
Player p = new Player(); // 에러. 추상클래스의 인스턴스 생성 불가

상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능

class AudioPlayer extends Player {
	void play(int pos) { /*내용 생략 */ }	// 추상메서드를 구현 (추상메서드 몸통만들기)
    void stop() {/*내용 생략*/}		// 추상메서드를 구현
}
AudioPlayer ap = new AudioPlayer();  // OK.
  • 추상메서드 구현을 했으므로 더 이상 추상메서드가 아니므로 abstract를 붙이지 않는다.
  • Player는 미완성설계도(=추상클래스)라서 인스턴스 생성이 불가하다.
  • AudioPlayer는 완성된설계도이므로 인스턴스 생성이 가능하다.
  • AudioPlayer 대신 Player 타입을 사용해도 Ok (Player=조상 / AudioPlayer=자손이기 때문에 다형성 발생)
  • Player.play를 실행하면, 실제 구현된 AudioPlayer의 객체 void play가 실행된다. (참조변수는 리모컨이라 버튼만 제공 / 몸통이 없어도 Ok)

추상 메서드 (abstract method)

미완성 메서드. 구현부(몸통, {})가 없는 메서드

  • 메서드 = 선언부 + 구현부 / 그런데, 추상 메서드 = 선언부만 존재
    / 주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명한다. /
    abstract 리턴타입 메서드이름(); // abstract(제어자)를 붙였으므로 추상 메서드가 된다.
    꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우
  • AudioPlayer는 상속받은 2개 모두 구현했기 때문에 abstract 붙일 필요 X
  • AbstractPlayer는 상속받았는데 2개 중 1개만 구현을 했다. 그래서 abstract를 붙여줘야 한다. (2개를 다 구현해야 완성되는데, 1개만 구현해서 미완성 상태다.)

추상 메서드의 예

추상 메서드 호출 가능(호출할 때는 선언부만 필요)

  • 메서드는 선언부만 알면 호출 가능하므로 추상메서드도 호출 가능
  • 인스턴스 메서드 호출 = 객체 생성 후 가능 / 지금은 추상클래스라 객체생성 불가
  • 그래서 1. 상속을 통해 자손을 완성 2. 자손 객체 생성 순서로 진행된다.
  • player라면 play와 stop 기능이 있어야 하니 맞게 구현해달라는 코드
  • play와 stop에 abstract 대신 {}을 사용해서 오버라이딩 해도 괜찮지만, abstract을 통해 필수적으로 구현하게 하는 강제적 역할을 할 수 있다.
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글