클래스 상속(extends)과 인터페이스 구현(implements)의 차이를 표로 정리해줄게!
extends) vs 인터페이스 구현 (implements) 비교| 항목 | 클래스 상속 (extends) | 인터페이스 구현 (implements) |
|---|---|---|
| 목적 | 기존 클래스의 기능을 재사용하고 확장 | 특정 기능(행동)만 따로 구현하도록 강제 |
| 키워드 | extends 사용 | implements 사용 |
| 다중 상속 가능 여부 | ❌ 불가능 (자바는 단일 상속만 지원) | ✅ 가능 (여러 개의 인터페이스를 동시에 구현 가능) |
| 구현해야 하는 것 | 부모 클래스의 메서드를 재정의(override)할 수도 있고, 그대로 사용할 수도 있음 | 반드시 인터페이스의 모든 추상 메서드를 구현해야 함 (abstract 메서드는 무조건 오버라이드 필요) |
| 생성자 상속 여부 | ✅ 가능 (부모 클래스의 생성자를 호출할 수 있음: super()) | ❌ 불가능 (인터페이스에는 생성자가 없음) |
| 필드(변수) 상속 여부 | ✅ 가능 (부모 클래스의 필드를 상속받아 사용할 수 있음) | ❌ 불가능 (인터페이스에는 필드가 없거나 public static final 상수만 가능) |
| 메서드 구현 여부 | 부모 클래스의 메서드를 상속받아 바로 사용 가능 | 인터페이스의 모든 메서드는 반드시 구현해야 함 (단, default 메서드는 구현할 수도 있음) |
| 사용 예시 | 부모 클래스의 공통 기능을 그대로 물려받고 싶을 때 | 특정 기능을 여러 클래스에서 공통적으로 구현할 때 |
| 대표적인 예시 | class Dog extends Animal {} | class Dog implements Runnable {} |
extends(클래스 상속) 예제// 부모 클래스
class Animal {
String name;
public void eat() {
System.out.println(name + "가 먹고 있습니다.");
}
}
// 자식 클래스 (Animal을 상속받음)
class Dog extends Animal {
public void bark() {
System.out.println(name + "가 짖고 있습니다.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "바둑이";
dog.eat(); // 부모 클래스의 메서드 사용 가능
dog.bark(); // 자식 클래스에서 추가한 메서드
}
}
📌 결과:
바둑이가 먹고 있습니다.
바둑이가 짖고 있습니다.
→ Dog 클래스는 Animal을 상속받았기 때문에 eat() 메서드를 바로 사용할 수 있음.
implements(인터페이스 구현) 예제// 인터페이스 정의
interface Movable {
void move(); // 추상 메서드 (반드시 구현해야 함)
}
// 인터페이스를 구현한 클래스
class Car implements Movable {
@Override
public void move() {
System.out.println("자동차가 이동합니다.");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car();
car.move(); // 인터페이스 메서드 구현
}
}
📌 결과:
자동차가 이동합니다.
→ Car 클래스는 Movable 인터페이스의 move() 메서드를 반드시 구현해야 함.
extends vs implements를 써야 할까?| 상황 | extends 사용 (클래스 상속) | implements 사용 (인터페이스 구현) |
|---|---|---|
| 기존 클래스를 확장하면서 기능을 추가하고 싶을 때 | ✅ | ❌ |
| 여러 개의 부모(다중 상속)를 받고 싶을 때 | ❌ (자바는 단일 상속만 가능) | ✅ (여러 인터페이스를 동시에 구현 가능) |
| 부모 클래스의 필드(변수)와 메서드를 물려받고 싶을 때 | ✅ | ❌ |
| 특정 기능(행동)만 여러 클래스에서 공유하고 싶을 때 | ❌ | ✅ |
is-a 관계일 때 (예: "개는 동물이다") | ✅ | ❌ |
can-do 관계일 때 (예: "자동차는 이동할 수 있다") | ❌ | ✅ |
extends: 부모 클래스가 있는 경우, 기능을 확장하고 싶을 때 사용 (is-a 관계)implements: 특정 기능을 강제적으로 구현하고 싶을 때 사용 (can-do 관계)implements)를 활용해야 함.이제 extends랑 implements 차이를 확실히 이해할 수 있을 거야! 😊
헷갈리는 부분 있으면 더 질문해줘~ 🚀