Java에서 추상화(abstraction)는 크게 추상 클래스(Abstract Class)와 인터페이스(Interface)를 통해 구현됩니다. 추상 클래스는 구현부가 없는 추상 메서드를 선언할 수 있으며, 그 실제 구현은 이를 상속받는 자식 클래스가 담당합니다. 아래 표에서 추상 클래스와 구체 클래스(Concrete Class)의 주요 차이점을 한눈에 확인할 수 있습니다.
추상 클래스 vs 구체 클래스 주요 차이점
| 번호 | 구분 기준 | 추상 클래스 (Abstract Class) | 구체 클래스 (Concrete Class) |
|---|---|---|---|
| 1 | 지원 메서드 | 추상 메서드와 구체 메서드를 모두 가질 수 있습니다. | 구체 메서드만 가질 수 있습니다. 추상 메서드가 단 하나라도 있으면 해당 클래스는 추상 클래스가 됩니다. |
| 2 | 인스턴스화 | new 키워드로 인스턴스를 생성할 수 없습니다. | new 키워드로 바로 인스턴스를 생성할 수 있습니다. |
| 3 | 추상 메서드 | 추상 메서드를 가질 수도 있고, 갖지 않을 수도 있습니다. | 추상 메서드를 가질 수 없습니다. |
| 4 | final 선언 | final 클래스로 선언할 수 없습니다. | final 클래스로 선언할 수 있습니다. |
| 5 | 선언 키워드 | abstract 키워드를 사용해 선언합니다. | 선언 시 abstract 키워드를 사용하지 않습니다. |
| 6 | 상속 | extends 키워드로 다른 클래스를 상속받을 수 있으며, 인터페이스도 함께 구현할 수 있습니다. | 마찬가지로 extends 키워드로 다른 클래스를 상속받을 수 있습니다. |
| 7 | 인터페이스 구현 | 인터페이스를 구현하더라도 모든 메서드를 완성하지 않으면 여전히 추상 상태이므로, 자식 클래스가 나머지를 구현해야 인스턴스화할 수 있습니다. | 인터페이스의 모든 메서드를 구현하기만 하면 손쉽게 인터페이스를 구현할 수 있습니다. |
추상 클래스 vs 구체 클래스 예제
다음 예제는 추상 클래스 Cat과 이를 상속받아 eat() 메서드를 구현하는 구체 클래스 Lion의 관계를 보여줍니다.
JavaTester.java
public class JavaTester {
public static void main(String args[]) {
Cat lion = new Lion();
lion.eat();
}
}
abstract class Cat {
abstract public void eat();
}
class Lion extends Cat {
public void eat() {
System.out.println("Lion eats");
}
}
실행 결과
Lion eats
정리
위 예제에서 Cat은 추상 클래스이므로 new Cat()처럼 직접 객체를 생성할 수 없습니다. 대신 자식 클래스인 Lion이 추상 메서드 eat()를 구현했기 때문에, 부모 타입 변수로 Lion 객체를 참조해 메서드를 호출할 수 있습니다. 이처럼 추상 클래스는 공통 구조와 규약을 정의하는 역할을, 구체 클래스는 그 세부 동작을 완성하는 역할을 담당합니다.