클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다.
클래스가 미완성이라는 것은 멤버의 개수와 상관없이 단지 미완성 메서드(추상메서드)를 포함하고 있다는 의미이다.
추상클래스로는 인스턴스를 생성할 수 없고 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.
추상클래스는 키워드 'abstract'를 붙이면 된다.
abstract class 클래스이름 { //... }
메서드는 선언부와 구현부로 구성되어있는데, 추상메서드는 선언부만 작성하고 구현부는 작성하지 않고 남겨둔 것을 의미한다.
추상메서드를 만드는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문이다.
추상메서드 역시 키워드 'abstract'를 붙여주고 구현부가 없으므로 괄호{} 대신 ';'를 적어준다.
/*주석을 통해 어떤 기능을 수해할 목적으로 작성하였는지 설명한다.*/ abstract 리턴타입 메서드이름();
추상클래스로부터 상속받은 자손클래스는 오버라이딩을 통해 조상인 추상클래스의 추상메서드를 모두 구현해줘야 한다. 추상메서드를 하나라도 구현하지 않는다면 해당 자손클래스 역시 추상클래스로 지정해줘야 한다.
상속이 자손클래스를 만드는데 조상클래스를 사용하는 것이라면, 이와 반대로 추상화는 기존의 클래스의 공통부분을 뽑아내서 조상클래스를 만드는 것이다.
추상화 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
구체화 상속을 통해 클래스를 구현, 확장하는 작업
자손클래스에서 오버라이딩해도 될텐데 굳이 추상클래스로 선언하는 이유?