자바에서 추상 클래스(Abstract Class)와 인터페이스(Interface)는 모두 객체 지향 프로그래밍의 핵심 개념인 추상화(Abstraction)를 구현하기 위한 장치이다. 두 개념 모두 하위 클래스에서 반드시 구현해야 하는 메서드를 정의하여 코드의 규격을 강제하고 다형성을 확보하는 역할을 한다. 그러나 선언 방식과 설계 목적, 메모리 및 다중 상속의 허용 여부 등에서 명확한 차이가 존재한다.
추상 클래스는 미완성된 설계도에 비유할 수 있으며, abstract 키워드를 사용해 선언한다. 하나 이상의 추상 메서드(구현부가 없는 메서드)를 포함할 수 있으며, 일반 클래스처럼 필드(변수)와 일반 메서드, 생성자도 가질 수 있다.
public abstract class Animal {
private String name; // 일반 필드
public Animal(String name) { // 생성자
this.name = name;
}
public void sleep() { // 일반 메서드
System.out.println(name + "이(가) 잠을 잔다.");
}
public abstract void makeSound(); // 추상 메서드 (자식 클래스에서 반드시 구현)
}
new Animal()과 같이 직접 객체를 생성할 수 없다.extends할 수 있다.인터페이스는 극단적으로 추상화된 대표적인 밑그림에 비유할 수 있으며, interface 키워드를 사용해 선언한다. 기본적으로 모든 필드는 public static final(상수)이며, 모든 메서드는 public abstract(추상 메서드)로 동작한다. (Java 8 이후부터는 default 메서드와 static 메서드 구현이 가능하다.)
public interface Swimmable {
void swim(); // public abstract 생략 가능
}
public interface Flyable {
void fly();
}
public class Duck implements Swimmable, Flyable {
@Override
public void swim() {
System.out.println("오리가 수영을 한다.");
}
@Override
public void fly() {
System.out.println("오리가 날아간다.");
}
}
implements할 수 있다.| 구분 | 추상 클래스 (Abstract Class) | 인터페이스 (Interface) |
|---|---|---|
| 선언 키워드 | abstract class | interface |
| 상속/구현 키워드 | extends | implements |
| 다중 지원 여부 | 단일 상속만 가능 | 다중 구현 가능 |
| 필드 (변수) | 일반 변수, 상수 모두 가능 | public static final (상수만 가능) |
| 생성자 | 생성자 존재 가능 | 생성자 존재 불가 |
| 메서드 | 추상 메서드 + 일반 구현 메서드 | 추상 메서드 (Java 8 이후 default, static 메서드 가능) |
| 핵심 목적 | 공통된 기능의 재사용 및 확장 (is-a 관계) | 동일한 행위의 규격 및 계약 강제 (can-do 관계) |
두 방식 모두 하위 클래스의 메서드 구현을 강제하지만, 설계하는 목적에 따라 선택이 달라진다.
추상 클래스를 사용하는 경우 (is-a 관계):
인터페이스를 사용하는 경우 (can-do 관계):
추상 클래스와 인터페이스는 모두 자바에서 추상화를 구현하는 중요한 도구이다. 추상 클래스는 '무엇인가(is-a)'에 집중하여 공통 상태와 기능을 상속을 통해 확장 및 재사용하는 데 목적이 있다.
인터페이스는 '무엇을 할 수 있는가(can-do)'에 집중하여 다중 구현을 통해 클래스의 행위 규격을 표준화하는 데 목적이 있다.