추상 클래스는 미완성 설계도로 볼 수 있다.
즉 추상클래스로 인스턴스는 생성할 수 없다. 추상 클래스는 상속을 통해서 자손 클래스에 의해서만 완성될 수 있다.
추상 클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는 데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다.
예를 들면 같은 크기의 Tv를 모델의 차이에 따라 나눌 때 Tv의 기본설계도를 두고 옵션에 따라 다른 클래스에 상속해서 사용하는 용도이다. 추상 클래스를 이용하면 중복되는 코드를 줄이고, 보기 편하게 만들 수 있다.
추상 클래스는 추상 메서드를 포함하고 있다는 것을 제외하고는 일반 클래스와 전혀 다르지 않다.
추상 클래스에도 생성자가 있으며, 멤버 변수와 메서드도 가질 수 있다.
추상 메서드를 포함하고 있지 않은 클래스에도 키워드 abstract를 붙여서 추상 클래스로 지정할 수도 있다. 추상메서드가 없는 완성된 클래스라 할지라도 추상클래스로 지정되면 클래스의 인스턴스를 생성할 수 없다.
추상 메서드(abstract method)
메서드는 선언부와 구현부(몸통)로 구성되어 있다고 했다. 선언 부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상 메서드이다. 즉, 설계만 해 놓고 실제 수행될 내용은 작성하지 않았기 때문에 미완성 메서드인 것이다.
메서드를 이와 같이 미완성 상태로 남겨 놓는 이유는 메서드의 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언 부만을 작성하고, 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려주고, 실제 내용은 상속받는 클래스에서 구현하도록 비워놓는 것이다.
/* 주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명한다 */
abstract 리턴타입 매서드이름();
추상 클래스로부터 상속받는 자손 클래스는 오버 라이딩을 통해 조상인 추상 클래스의 추상 메서드를 모두 구현해주어야 한다. 만일 조상으로부터 상속받은 추상메서드 중 하나라도 구현하지 않는다면, 자손 클래스 역시 추상 클래스로 지정해 주어야 한다.
메서드의 이름과 매개변수, 리턴 타입은 반드시 주석에 넣도록 하자.
추상 클래스의 작성
여러 클래스에 공통적으로 사용될 수 있는 클래스를 바로 작성하기도 하고, 기존의 클래스의 공통적인 부분을 뽑아서 추상 클래스로 만들어 상속하도록 하는 경우도 있다.
상속계층도를 따라 내려갈수록 (자손 클래스로 갈수록) 기능이 추가되어 세분화되며, 상속계층도를 따라 올라갈수록(조상 클래스로 갈수록) 공통 요소만 남게 된다.
추상화 : 클래스간의 공통점을 찾아내서 공통의 조상을 만드는 작업
구체화 : 상속을 통해 클래스를 구현, 확장하는 작업
다형성에서 배웠듯이 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하는 것이 가능하기 때문에 이처럼 조상 클래스타입의 배열에 자손 클래스의 인스턴스를 담을 수 있는 것이다.
만일 이들 클래스 간의 공통조상이 없었다면 이처럼 하나의 배열로 다룰 수 없을 것이다.