추상화와 Java의 추상 메서드
추상화에서 추상이란 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용이라고 사전에서 정의하고 있다. 프로그래밍에서는 핵심적이거나 공통되는 속성 및 기능을 간추리는 것을 의미한다. 상속이 자식 클래스를 만드는데 부모 클래스를 사용하는 것이라면, 추상화는 이와 반대로 기존 클래스의 공통 부분을 뽑아내 부모 클래스를 만드는 것이라고 볼 수 있다. 추상화의 반대되는 개념을 구체화라고 하며 상속 계층도의 위로 올라갈 수록 공통 요소만 남고 밑으로 갈수록 세분화된다.
추상 클래스는 미완성 메서드(추상 메서드)를 가지고 있는 미완성 설계도라고 할 수 있다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상 클래스로 인스턴스는 생성할 수 없으며 상속을 통해 자식 클래스에 의해서만 완성될 수 있다. 추상 클래스 자체로는 클래스의 역할을 다 못하지만 새로운 클래스를 작성하는데 있어 바탕이 되는 부모 클래스로서 중요한 의미를 갖는다. 필요한 공통 부분만을 그린 미완성 설계도를 만들어 놓고 이를 이용해서 각각의 설계도를 효율적으로 완성하는 것이다. 추상 클래스는 선언부에 키워드 abstract
을 붙여 이 클래스에 추상 메서드가 있으니 상속을 통해서 구현해주어야 한다는 것을 알려준다.
abstract class 클래스명 { ... }
추상 클래스는 추상 메서드를 포함하고 있다는 것을 제외하고는 일반 클래스처럼 생성자, 멤버 변수와 메서드를 가질 수 있다.
메서드의 선언부만 작성하고 구현부는 작성하지 않은 채로 남겨 둔 것이 추상 메서드이며 설계만 해 놓고 실제 수행될 내용은 작성하지 않았기 때문에 미완성 상태이다. 메서드를 미완성으로 남겨 둔 이유는 메서드의 내용이 상속 받는 클래스에 따라 달라질 수 있기 때문에 부모 클래스에는 선언부만 작성하고 주석을 덧붙여 어떤 기능을 수행할 목적으로 작성되었는지 알려준 뒤 실제 내용은 상속 받는 클래스에서 구현하도록 하기 위함이다. 추상 메서드 역시 키워드 abstract
을 붙여 주고 구현부가 없으므로 중괄호 대신 문장의 끝을 알리는 ‘;’을 적어준다.
/* 추상 메서드 설명 */
abstract 리턴타입 메서드명();
추상 클래스로부터 상속 받는 자식 클래스는 오버라이딩을 통해 부모인 추상 클래스의 추상 메서드를 모두 구현해야 한다. 만일 부모로부터 상속 받은 추상 메서드 중 하나라도 구현하지 않는다면 자식 클래스 역시 추상 클래스로 지정해 주어야 한다.
작은 카페가 있고 카페에는 음료를 만드는 바리스타와 그 외 업무를 담당하는 스태프가 직원으로 일하고 있다. 바리스타와 스태프 둘 다 손님이 오면 인사를 해야하고 모든 업무가 끝나면 바리스타는 주방을, 스태프는 매장을 청소해야한다. 이를 다음과 같은 코드로 나타낼 수 있다.
public abstract class Employee {
public void greet() { System.out.println("어서오세요."); }
public abstract void clean(); // 각자 구역 청소
}
/////////////////////////////////////////////////////////////////////
public class Barista extends Employee {
@Override
public void clean() { /* 주방 청소 */ }
public void makeADrink() {}
}
/////////////////////////////////////////////////////////////////////
public class Staff extends Employee{
@Override
public void clean() { /* 매장 청소 */ }
public void open() {}
public void close() {}
public void takeOrders() {}
}
둘 다 손님을 맞이해야 하고 청소도 해야하지만 청소 구역이 서로 다르므로 상속을 통해 구현하도록 clean 메서드를 추상 메서드로 선언해 주었다. 바리스타와 스태프는 Employee 클래스를 상속 받아 둘 다 손님을 맞이하고 청소할 수 있다. 그리고 각자 고유 업무(주문 받기, 음료 제조 등)를 정의하여 수행한다.