추상클래스
추상클래스(abstract class)는 미완성 설계도로 비유할 수 있는 구체화되지 않은 클래스입니다. 미완성의 추상 메서드를 포함하고 있으며, 반드시 상속을 통해 완성한 후 사용할 수 있습니다. 따라서 추상클래스 자체로는 인스턴스 생성이 불가능합니다.
추상클래스는 추상메서드 외에도 일반적인 멤버변수와 메서드, 생성자도 포함합니다.
추상클래스의 특징을 정리하면 다음과 같습니다.
- 클래스 앞에 abstract 키워드를 붙여서 정의
- 인스턴스 생성 불가
- 추상 메서드를 포함 (그 외 멤버변수, 메서드, 생성자도 포함 가능)
다음과 같이 클래스 앞에 abstract 키워드를 붙여서 추상클래스를 생성합니다.
abstract class [클래스명] {
// 클래스 내용
}
※ 추상메서드가 없어도 클래스에 abstract 키워드를 붙이면 추상클래스가되고 인스턴스 생성이 불가능.
1.1 추상메서드
추상클래스 내에 선언부만 작성하고 구현부는 작성하지 않은 형태로 만든 메서드를 추상메서드라고 합니다. 상속받는 클래스에서 구현하도록 하기위해 구현부는 작성하지 않은 형태입니다.
추상메서드는 다음과 같은 형태로 생성합니다.
abstract [리턴타입] [메서드명]();
※ 추상클래스를 상속받은 자식 클래스는 추상클래스의 추상메서드를 모두 구현해줘야 합니다. 그렇지 않을 경우 자식 클래스도 추상클래스로 지정해줘야합니다.
1.1 추상클래스 작성
이전에 알아봤던 상속의 개념이 부모 클래스의 속성과 기능을 물려받아 구체화하는 것이라면, 추상화는 기존 클래스의 공통부분을 뽑아서 부모 클래스를 만드는 것이라고 할 수 있습니다.
추상화 : 클래스간의 공통점을 찾아내어 부모 클래스를 만듦.
구체화 : 상속을 통해 클래스를 구현, 확장
다음 예제를 통해 추상클래스 및 추상화와 구체화에 대해 확인해보겠습니다.
public class AbstractClassTest { public static void main(String[] args) { // Unit unit = new Unit(); // 인스턴스 생성 불가 Marine marine = new Marine(); Tank tank = new Tank(); Dropship dropship = new Dropship(); marine.move(10, 20); marine.stop(); marine.stimPack(); tank.move(30, 40); tank.stop(); tank.changeMode(); dropship.move(50, 60); dropship.stop(); dropship.load(); dropship.unload(); } } abstract class Unit { String unitName; Unit(String unitName) { this.unitName = unitName; } abstract void move(int x, int y); // 추상클래스 void stop() { System.out.println(unitName + " stop!"); } } class Marine extends Unit { Marine() { super("Marine"); } void move(int x, int y) { System.out.println(unitName + " move to x : " + x + ", y : " + y); } void stimPack() { System.out.println("Stim Pack Yeah!!!"); } } class Tank extends Unit { Tank() { super("Tank"); } void move(int x, int y) { System.out.println(unitName + " move to x : " + x + ", y : " + y); } void changeMode() { System.out.println("Change Mode!"); } } class Dropship extends Unit { Dropship() { super("Dropship"); } void move(int x, int y) { System.out.println(unitName + " move to x : " + x + " / y : " + y); } void load() { System.out.println("Load"); } void unload() { System.out.println("Unload"); } }
위의 예제를 실행하면 다음과 같은 결과가 출력됩니다.
Marine move to x : 10, y : 20
Marine stop!
Stim Pack Yeah!!!
Tank move to x : 30, y : 40
Tank stop!
Change Mode!
Dropship move to x : 50 / y : 60
Dropship stop!
Load
Unload
move() 추상 메서드를 포함한 Unit 추상 클래스를 대상으로 다른 클래스에서 상속하여 각각 구현 후 실행한 결과를 확인할 수 있습니다.
5번째 줄은 추상클래스에 대해 객체를 생성한 것인데 실행하면 'Cannot instantiate the type Unit' 이라는 에러 문구가 출력되어, 추상 클래스 자체로는 인스턴스를 생성할 수 없음을 확인할 수 있습니다.
이상으로 자바의 추상클래스에 대해서 알아봤습니다.
※ 참고 문헌
남궁성, 『Java의 정석 3rd Edition』, 도우출판(2016), p375 ~ p380. Chapter 07 객체지향 프로그래밍 II
programmers, 추상클래스, https://programmers.co.kr/learn/courses/5/lessons/188