추상 클래스는 미완성 메소드를 포함하고 있는 클래스로, 인스턴스를 생성할 수는 없으며, 상속을 통해서 자손 클래스에 의해서만 완성될 수 있다.
추상 클래스 자체는 클래스로서의 역할을 다 하지는 못하지만, 새로운 클래스 작성에 있어서 바탕이 되는 조상 클래스로 중요한 의미를 가진다. 새로운 클래스 작성에 있어서 틀을 갖추고 시작할 수 있도록 해주는 것이다.
abstract class 클래스명{ }
추상 클래스의 형태는 위와 같고, 추상 메스드를 포함하고 있다는 것을 제외하면 일반 클래스와 다를 것 없이 생성자가 있으며, 멤버변수와 메소드도 가질 수 있다.
추상 메소드
원래 메소드는 선언부와 내용이 있는 구현부로 되어있지만, 추상 메소드의 형태는 선언부만 있고, 구현무는 존재하지 않는다.
이러한 미완성 상태로 남기는 이유는 메소드 내용이 상속받는 클래스에 따라 달라질 수 있기 때문에 조상 클래스에서는 선언부만 작성하고, 주석을 붙여 어떤 기능을 위해 만들어 졌는지만 밝힌다. 그리고 실제 내용은 상속받는 클래스에서 구현하는 것이다.
abstract 리턴타입 메소드이름( );
추상 메소드의 형태는 위와 같으며, 구현부가 없기 때문에 중괄호를 사용하는 대신 문장의 끝을 알리기 위해 ;를 붙인다.
위의 예제처럼 추상 클래스에서 추상 메소드를 만들어 틀을 만들고, 일반 클래스에서 추성 클래스를 상속받아 그 틀 안에 메소드 내용을 작성하는 방식을 취한다.
추상 클래스의 작성
상속은 자손 클래스를 만드는데 조상 클래스를 사용하는 것이다.
반대로 추상화는 기존 클래스의 공통부분을 뽑아내어 조상 클래스로 만드는 것이라고 볼 수 있다.
이러한 개념은 구체화의 개념과 대비시켜 생각하면 쉽게 이해가 가능하다. 상속 계층도를 따라서 내려갈수록 클래스에는 기능이 점점 추가되어 구체화의 정도가 심해진다. 반대로 상속 계층도를 따라서 올라갈수록 클래스는 공통 요소만 남게 되면서 추상화의 정도가 심해지게 된다.
위의 클래스들을 보면 공통되는 멤버변수와 메소드들이 존재하는 것을 볼 수 있다. 추상화는 이들의 공통되는 부분을 뽑아내서 조상 클래스로 만드는 것이라고 앞에서 배웠었다.
공통되는 멤버변수인 x, y값과 stop메소드는 일반적인 형태로 조상 클래스에 넣었다. move메소드를 추상 메소드 형태로 구현한 이유는 지상과 공중 유닛 별로 움직이는 방식이 다르기 때문이며, 이에 따라서 큰 틀은 추상 메소드로 잡아놓고 자세한 구현부분은 각각의 클래스에서 구현할 수 있도록 하는 것이다.