자바의정석

[자바의 정석 - 기초편] ch7-31,32 추상 클래스, 추상 메서드

유호야 2022. 3. 22. 15:40
반응형

ch7-31 추상 클래스(abstract classs)

다형성까지 이해를 해야지 이 시간 부터의 내용들이 이해가 간다.

- 미완성 설계도. 미완성 메서드를 갖고 있는 클래스 
멤버가 적거나, 부족한 / 미완성 메서드를 가진 경우 

미완성메서드 (추상메서드) = 몸통이 없는 메서드
이러한 메서드를 가지고 있는 클래스가 추상 클래스 

추상 메서드는 몸통이 없는 대신에 abstract를 붙이면 된다. 

- 다른 클래스 작성에 도움을 주기 위한 것, 인스턴스 생성 불가.
설계도가 완성되어야 제품이 생산될 수 있듯이 인스턴스 생성이 불가능하다. 

- 상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능
구현 - 추상 메서드 몸통 만들기 
몸통을 만들었을 때는 더 이상 추상 메서드가 아니다

 


ch7-32 추상 메서드(abstract method) 

- 미완성 메서드. 구현부 (몸통, {} )가 없는 메섣 
abstract 리턴타입 메서드이름();  -- abstract는 제어자

꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우

조상 추상 클래스를 상속받았을 때, 추상 메서드를 모두 구현해야 한다.
즉 몸통을 작성해야지 추상클래스에서 벗어날 수 있고, 그렇지 않았을 경우에
실수로 abstract를 누락시키면 에러가 발생한다. 

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

자손마다 play 의 기능 내용이 다를 경우에 몸통 부분을 선언할 수가 없다. 
따라서 상속을 받을 때 해당 빈 설계도를 채움으로써 각 클래스마다 같은 기능이지만 방식이 다르 부분들의 설계도를 완성할 수 있다. 

 추상메서드를 호출 가능한가? 
같은 클래스 내에서 몸통이 없는 부분을 호출하는 경우

인스턴스 메서드는 객체 생성 후에 호출할 수 있지만, 추상 클래스는 객체 생성이 불가능하다. 
상속을 통해서 자손의 객체를 완성한 이후에 추상 메서드를 실행할 수 있다. 

추상 메서드로 만들어 놓으면 더 많은 메서드를 만들 수 있다. 


추상 메서드란 고현부가 없는 미완성 메서드이다. 
그리고 이 미완성 메서드를 가지고 있는 클래스가 추상 클래스이다. 


 

 

AudioPlayer 클래스에서 Player의 두 개 추상 메서드를 구현하지 않을 경우에
AudioPlayer에 abstract를 남겨줌으로써 구현부 내에 추상 메서드가 있다는 것을 알려야 한다.
또한 PlayerTest 클래스의 메인 메서드 내에서 new AudioPlayer() 와 같이 객체 생성은 불가능하다.
= 추상 클래스로 객체 생성은 불가능하다. 

 

package ch07;

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("재생을 중지합니다."); }
}

public class PlayerTest {

	public static void main(String[] args) {
//		Plyaer p = new Player(); // 추상 클래스의 객체 생성 
			
//		AudioPlayer ap = new AudioPlayer();
		Player ap = new AudioPlayer(); 
		// 기능을 다 갖고 있다. 리모콘이 추상메서드라고 해도 이미 기능이 구현된 메서드를 호출한다. 
		//audioPlayer 리모콘으로 호추루해도 되고, Player의 리모콘으로 호출해도 된다.
		ap.play(100);
		ap.stop();

	}

}
반응형