(객체part2 ) 9. 추상클래스
- 추상클래스의 정의 방법과 구현 방법
추상클래스란 ?
-미완성 설계도, 미완성 메서드를 갖고 있는 클래스
추상클래스를 만드는 법 ?
class 앞과 구현하지 않을 메서드 앞에 abstract를 붙여 준다.
ex)
abstract class Player {
abstract void play(int pos);
abstract void stop();
}
이 처럼 메서드를 선언만 해주고 , {} 몸통 부분을 구현해주지 않으면, 추상클래스가 만들어진다.
추상 클래스는 아래 처럼 인스턴스 생성이 불가능하다.
- 일부만 구현한 상속 클래스는 여전히 추상클래스인가
뿐만 아니라 추상 클래스를 상속 받아 , 일부만 구현하더라도 추상클래스로 정의한다. 그렇기 때문에 일부만 구현한 추상 클래스 또한
객체 생성이 안되는 모습을 볼 수 있다.
하지만 상속을 통해 추상 메서드를 전부 몸체를 구현해주면 인스턴스 생성이 가능해진다.
- 추상클래스 참조변수의 형변환
뿐만 아니라, 참조변수의 형변환으로도 객체 생성이 가능해진다. 하지만, 리모콘이 Player이기 때문에 버튼은 play,stop 뿐이다.
그렇기 때문에 실제 객체인 AudioPlayer가 갖고 있는 메서드가 3개 여도 2개밖에 호출되지 않은 모습을 볼 수 있다.
- 추상 클래스를 사용하는 이유
추상클래스는 꼭 필요하지만 다르게 구현될 것으로 예상되는 경우 사용한다.
오버라이딩을 통해서 자손 클래스에서 메서드를 재구현 할 수 있음에도 불구하고, 우리가 추상클래스를 사용하는 이유는 무엇일까?
그것은 단순히, 복잡성을 해결하기 위해서이다. 추후에 코드가 길어지고 클래스가 많아질 수록, 오버라이딩을 깜빡 잊어버리는 경우를
방지하기 위해서이다.
메서드 내에서도 추상 메서드 생성이 가능하다. 나중에 자손이 상속을 통해 추상 메서드를 완성할 수 있기 때문이다.
- 메서드 안에서, 추상 메서드 호출 여부
하지만, '생성'은 가능하지만 '호출'할 수는 없다. 인스턴스 메서드는 객체 생성 후에 호출이 가능하기 때문이다.
즉, 인스턴스를 만들기 위해서는 상속으로 추상클래스를 완전히 구현해야하고 , 추상 클래스를 완전히 구현해야만 추상클래스의 메서드를
호출 할 수 있기 때문에 , 추상 클래스를 구현을 해야만 호출이 가능해지는 것이다.