ch7-31 추상 클래스(abstract class)
미완성 메서드를 갖고 있으면 미완성 클래스이다. 이때, 미완성은 추상이라는 말과 같다. 추상 메서드를 갖고 있으면 추상 클래스이다. 추상 메서 드는 몸통{ } 즉 구현부가 없는 메서드로 미완성이기 때문에 구현부를 만들고 객체를 생성해야 한다. 구현부가 없는 대신에 추상 메서드 앞에는 abstract 제어자를 붙이고, 추상 메서드를 갖고 있는 클래스 또한 abstract 제어자를 붙인다.
추상 클래스의 인스턴스는 추상 메서드의 구현부가 완성되기 전에 객체 생성이 불가능하다. 추상 클래스를 상속 받아서 추상 메서드를 구현하면 더이상 추상 메서드가 아니기 때문에 abstract 제어자를 붙이지 않는다. Player는 추상 클래스이지만 상속받은 AudioPlayer는 구현부가 완성되어 인스턴스, 객체 생성 가능하다.
⭐⭐ 상속을 통해 추상 메서드를 완성하면 참조 변수를 조상인 Player로 사용할 수 있다. Player는 추상 클래스인데 어떻게 쓸 수 있을까? 실제로 구현된 객체는 상속받아 구현된 AudioPlayer 클래스의 play 메서드가 실행된다.
ch7-32 추상 메서드(abstract method)
추상 메서드는 구현부가 없는 메서드로 제어자 abstract를 앞에 써야 한다. 추상 메서드를 만드는 이유는 자손마다 다르게 구현될 경우가 있기 때문이다.
예제를 보면 AudioPlayer는 상속받은 조상의 메서드를 전부 구현했지만 AbstractPlayer는 1개만 구현해서 아직 미완성 클래스이다. 따라서 제어자 abstract를 붙여야 한다. 제어자 abstract를 붙이지 않으면 오류이다.
보이지는 않지만 abstract void stop();을 상속받았다.
Player클래스에 재생 play, 멈춤 stop 메서드가 있다. 상속받는 Player에 따라 작동하는 방식이 달라 추상 메서드로 만들어서 자손 각자의 기능에 맞게 구현하도록 한다.
play(currentPos); 인스턴스 메서드에서 호출할 수 있을까? 메서드는 선언부만 알면 호출할 수 있다. 우선 인스턴스 메서드는 객체 생성 후에 호출 할 수 있다. 현 Player 클래스는 추상 클래스 이므로 객체 생성을 할 수 없다. 따라서 선언부만 작성하더라도 호출이 불가능하다. (Player 클래스는 추상 클래스로 호출할 수 없다.)
따라서 Player 클래스 객체를 생성하기 앞서 자손이 상속을 받고 구현부를 만들고 자손 객체가 생성되기 때문에 이러한 코드가 가능하다.
abstract 쓰지 않고 몸통 대충 만들고 override하면 안되는 걸까? abstract를 쓰는 것은 Player라면 play, stop이 있어야하는 것을 강제로 알려준다. 만약 abstract가 없으면 자손이 조상이 다 구현했다 생각하고 메서드를 따로 구현하지 않을 수 있다.
실습
코드와 실행 결과
다형성으로 참조 변수 Player 사용할 수 있다.
'자바 > 자바의 정석 Ch.7 객체지향 프로그래밍 II' 카테고리의 다른 글
ch7-33,34 추상 클래스의 작성2 (0) | 2023.04.22 |
---|---|
ch7-33,34 추상클래스의작성1 (0) | 2023.04.22 |
ch7-29,30 여러 종류의 객체를 배열로 다루기 (0) | 2023.04.21 |
ch7-27,28 매개변수다형성 (0) | 2023.04.20 |
ch7-26 instanceof 연산자 (0) | 2023.04.19 |