오늘은 추상 클래스(Abstract Class)와 인터페이스(Interface)의 차이에 대해 살펴보려고 합니다. 두 개념은 상당히 비슷하게 보이지만, 서로 다른 역할을 하는 중요한 구성 요소입니다. 이 둘의 차이점을 이해하는 것은 자바 프로그래밍에서 꼭 필요한 지식입니다.
추상 클래스 (Abstract Class)
추상 클래스는 하나 이상의 추상 메소드(구현되지 않은 메소드)를 포함하는 클래스입니다. 이 클래스를 상속받는 자식 클래스는 부모 클래스의 추상 메소드를 모두 구현해야 합니다.
추상 클래스는 일반적인 클래스처럼 멤버 변수, 생성자, 일반 메소드를 포함할 수 있습니다. 그래서 추상 클래스를 상속받는 클래스는 이미 구현된 일부 기능을 재사용할 수 있습니다.
추상 클래스는 그 자체로는 객체를 생성할 수 없습니다. 따라서, 주로 템플릿 메소드 패턴 등에서 사용되며, 상속을 통해 자식 클래스에서 구체적인 동작을 정의합니다.
public abstract class AbstractClassExample {
// 추상 메소드 (구현되지 않음)
public abstract void abstractMethod();
// 일반 메소드 (구현됨)
public void normalMethod() {
System.out.println("이것은 추상 클래스의 일반 메소드입니다.");
}
}
public class ChildClass extends AbstractClassExample {
@Override
public void abstractMethod() {
System.out.println("이것은 자식 클래스에서의 추상 메소드 구현입니다.");
}
}
public class Main {
public static void main(String[] args) {
ChildClass child = new ChildClass();
child.abstractMethod(); // "이것은 자식 클래스에서의 추상 메소드 구현입니다." 출력
child.normalMethod(); // "이것은 추상 클래스의 일반 메소드입니다." 출력
}
}
인터페이스 (Interface)
인터페이스는 모든 메소드가 추상 메소드인 자바의 특별한 타입입니다. 즉, 인터페이스는 구현된 것이 아무것도 없는 '틀'입니다.
인터페이스는 implements 키워드를 사용하여 클래스에서 구현할 수 있습니다. 이때 해당 클래스는 인터페이스에 선언된 모든 메소드를 구현해야 합니다.
인터페이스는 멤버 변수를 가질 수 있지만, 이는 항상 public static final로 선언되어야 합니다. 즉, 인터페이스의 변수는 항상 상수입니다.
public interface InterfaceExample {
// 추상 메소드 (구현되지 않음)
void abstractMethod();
// 상수 (자동으로 public static final 선언됨)
int CONSTANT = 10;
}
public class ChildClass implements InterfaceExample {
@Override
public void abstractMethod() {
System.out.println("이것은 자식 클래스에서의 추상 메소드 구현입니다.");
}
}
public class Main {
public static void main(String[] args) {
ChildClass child = new ChildClass();
child.abstractMethod(); // "이것은 자식 클래스에서의 추상 메소드 구현입니다." 출력
System.out.println(InterfaceExample.CONSTANT); // 10 출력
}
}
공통점 및 차이점
추상 클래스와 인터페이스는 모두 추상 메소드를 가지고 있습니다. 이들은 모두 '무언가를 구현해야 한다'는 것을 강제하는 역할을 합니다. 하지만, 그 방법과 사용 목적에서 차이가 있습니다.
- 추상 클래스는 일반 메소드와 멤버 변수, 그리고 생성자를 가질 수 있습니다. 반면 인터페이스는 오직 추상 메소드와 상수만 가질 수 있습니다.
- 추상 클래스는 상속(extends)을 통해 구현됩니다. 반면 인터페이스는 구현(implements)을 통해 구현됩니다.
- 추상 클래스는 자식 클래스가 특정 기본 동작을 상속받을 수 있도록 하는데 주로 사용됩니다. 이는 템플릿 메소드 패턴과 같은 디자인 패턴에서 주로 볼 수 있습니다. 반면, 인터페이스는 클래스가 특정 동작을 수행하도록 강제하는 '계약'의 역할을 합니다. 이 계약을 준수하기 위해 클래스는 인터페이스에서 정의된 모든 메소드를 구현해야 합니다.
결국, 추상 클래스와 인터페이스는 모두 객체 지향 프로그래밍에서 중요한 요소입니다. 어떤 상황에서 어떤 것을 사용할지는 구체적인 문제와 요구 사항에 따라 달라집니다.
여기서 한가지 더 주목해야 할 점은 자바에서 클래스는 오직 하나의 클래스만 상속받을 수 있지만, 여러 인터페이스를 구현할 수 있다는 점입니다. 이로 인해 인터페이스는 다중 상속의 효과를 가져올 수 있습니다.
'개발 > Java' 카테고리의 다른 글
Java에서의 마커 인터페이스(MarkerInterface) (0) | 2023.07.19 |
---|---|
Java에서의 다중상속 (0) | 2023.07.19 |
Java에서의 인터페이스(Adapter)의 강제성 소멸과 장점 (0) | 2023.07.18 |
Java에서의 인터페이스 (Interface) (0) | 2023.07.18 |
Java에서의 추상 클래스와 추상 메소드 (0) | 2023.07.18 |