Java에서 추상 클래스(Abstract Class)와 인터페이스(Interface)는 객체 지향 프로그래밍의 핵심 개념으로, 다형성을 구현하는 데 중요한 역할을 합니다.
그러나 이 둘은 서로 다른 목적과 용도로 설계되었습니다.
이 글에서는 추상 클래스와 인터페이스의 특징과 차이점에 대해 알아보겠습니다.
추상 클래스는 하나 이상의 추상 메소드를 포함하는 클래스입니다.
추상 메소드는 구현되지 않은 메소드로, 이를 상속받는 하위 클래스에서 반드시 구현해야 합니다.
추상 클래스는 자체는 인스턴스화할 수 없으며(= new 연산자 사용 X), 다른 클래스가 이를 상속받아 구체적인 구현을 제공해야 합니다.
abstract class Animal {
abstract void sound();
}
abstract class Animal {
void eat() {
System.out.println("The animal eats");
}
}
public static void main(String[] args) {
Animal dog = new Animal(); // 불가능!
}
class Dog implements Animal, Male { // 불가능!
public void sound() {
System.out.println("The dog barks");
}
public void protect() {
System.out.println("The dog protects");
}
}
인터페이스의 모든 메소드는 추상 메소드입니다.
인터페이스는 클래스가 구현해야 하는 메소드의 청사진을 정의합니다.
Java 8 이후로 deafult
메소드와 static
메소드도 포함할 수 있습니다.
인터페이스는 다중 상속을 허용하여, 하나의 클래스가 여러 인터페이스를 구현할 수 있습니다.
abstract
키워드를 생략할 수 있습니다.interface Animal {
void sound();
}
default
, static
메소드를 포함할 수 있습니다.interface Animal {
static void sound() {
System.out.println("");
}
}
public static void main(String[] args) {
Animal dog = new Animal(); // 불가능!
}
class Dog implements Animal, Male { // 가능!
public void sound() {
System.out.println("The dog barks");
}
public void protect() {
System.out.println("The dog protects");
}
}
static
, final
상수를 포함할 수 있습니다.interface Animal {
static final int leg = 4;
}
특징 | 추상 클래스 | 인터페이스 |
---|---|---|
메소드 구현 | 구체 메소드와 추상 메소드 모두 포함 | 기본적으로 추상 메소드만 포함, Java 8 이후 `default`, `static` 메소드 포함 가능 |
인스턴스화 | 불가능 | 불가능 |
다중 상속 | 불가능 | 가능 |
생성자 | 가질 수 있음 | 가질 수 없음 |
필드 | 인스턴스 변수, 상수 가능 | 상수만 가능 (`static`, `final`) |