인터페이스와 추상클래스의 차이를, 코드 예시와 함께 간단히 정리했습니다.
인터페이스와 추상클래스는 모두 객체지향 프로그래밍에서 공통된 규칙이나 기능을 정의하기 위해 사용합니다.
하지만 가장 큰 차이는 “무엇을 위한 것인가?”입니다.
- 인터페이스 → 클래스가 어떤 기능을 해야 하는지 규격을 정하는 것
- 추상클래스 → 여러 클래스가 공통으로 사용하는 기능을 물려주는 것
인터페이스(Interface)
인터페이스는 클래스가 어떤 동작을 반드시 제공해야 하는지 규격(계약)을 정의합니다.
interface Flyable {
void fly();
}
interface Swimmable {
void swim();
}
Flyable은 "날 수 있어야 한다"는 규격을 정의하고,
Swimmable은 "헤엄칠 수 있어야 한다"는 규격을 정의합니다.
그리고 오리는 두 가지 기능을 모두 할 수 있으므로 여러 인터페이스를 동시에 구현할 수 있습니다.
class Duck implements Flyable, Swimmable {
public void fly() {
System.out.println("오리가 난다");
}
public void swim() {
System.out.println("오리가 헤엄친다");
}
}
이처럼 자바에서는 하나의 클래스가 여러 인터페이스를 동시에 구현할 수 있습니다.
참고로 최근 자바의 인터페이스는 default, static 메서드를 통해 일부 구현을 포함할 수도 있습니다. 따라서 "인터페이스에는 구현이 없다"라고 단정하기보다는 "주로 규격을 정의한다"라고 이해하는 것이 정확합니다.
추상클래스(Abstract Class)
추상클래스는 여러 클래스에서 공통으로 사용하는 기능을 한 곳에서 구현하고 물려주기 위해 사용합니다.
abstract class Animal {
// 모든 동물이 공통으로 사용하는 기능
void breathe() {
System.out.println("숨을 쉰다");
}
// 동물마다 다르게 구현해야 하는 기능
abstract void sound();
}
Animal은 모든 동물이 숨을 쉬는 공통적인 기능인 breathe()를 직접 구현해두었습니다.
반면 동물마다 소리가 다르기 때문에 sound()는 추상 메서드로 만들어 자식 클래스가 직접 구현하도록 합니다.
class Dog extends Animal {
void sound() {
System.out.println("멍멍");
}
}
Dog는 Animal을 상속받기 때문에 breathe()를 다시 작성할 필요가 없습니다.
Dog dog = new Dog();
dog.breathe(); // 숨을 쉰다
dog.sound(); // 멍멍
즉, 공통 기능은 부모가 제공하고, 자식마다 다른 기능만 자식이 구현하는 방식입니다.
핵심 차이
구분인터페이스추상클래스
| 주요 목적 | 동작의 규격(계약) 정의 | 공통 기능을 물려주기 |
| 메서드 | 추상 메서드 + default, static 등 | 일반 메서드 + 추상 메서드 |
| 관계 | "~할 수 있다" | "~이다" |
| 다중 사용 | 여러 인터페이스 구현 가능 | 클래스는 하나만 상속 가능 |
| 핵심 키워드 | implements | extends |
정리
두 개념을 가장 간단하게 구분하면 다음과 같습니다.
따라서 여러 클래스에 같은 기능을 적용해야 한다면 인터페이스,
여러 클래스가 공통된 코드와 구조를 공유해야 한다면 추상클래스를 고려할 수 있습니다.
쉽게 기억하면,
-> 인터페이스 = 기능에 대한 약속
-> 추상클래스 = 공통 기능을 가진 부모 클래스
**
참고 문서
https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html?utm_source=chatgpt.com
Interfaces (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritance)
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Dev.java for updated tutorials taking advantag
docs.oracle.com
'DEV > cs' 카테고리의 다른 글
| [CS] TCP vs UDP 비교 (0) | 2026.09.18 |
|---|---|
| [CS] 데드락(Deadlock)이란 - 발생 조건과 해결 방법 (0) | 2026.09.17 |
| [CS] JAVA 가비지 컬렉션(GC)이란 (0) | 2026.09.16 |
| [CS] 객체지향과 절차지향 프로그래밍이란, 비교 (0) | 2026.09.14 |
| [CS] 전략 패턴(Strategy Pattern)이란 (0) | 2026.09.11 |