상속 vs 인터페이스

Pr_C1oser·2024년 11월 19일
0

자바 상속과 인터페이스 구현의 차이

1. 상속 (Inheritance)

상속의 핵심:

  • is-a 관계: 하위 클래스가 상위 클래스의 속성과 행동(메서드)을 "물려받는다."
  • 재사용성과 코드 중복 방지.
  • 클래스 계층 구조를 만들기 위해 사용.

주요 특징

  • 단일 상속만 가능: 자바는 다중 상속을 지원하지 않음.
  • 하위 클래스는 상위 클래스의 메서드를 재정의(override) 가능.
  • 상위 클래스의 공통 동작을 상속받아 재사용하거나 확장 가능.

예시

class Animal {
    void eat() {
        System.out.println("This animal eats food.");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("The dog barks.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();  // 상속된 메서드
        dog.bark(); // Dog 클래스에서 정의된 메서드
    }
}

2. 인터페이스 (Interface)

인터페이스의 핵심:

  • can-do 관계: 클래스가 특정 행동(메서드 구현)을 할 수 있도록 보장.
  • 특정 행동의 계약(Contract)을 정의하는 역할.
  • 다중 구현 가능.
  • 인터페이스는 인터페이스 다중 상속이 가능.

주요 특징

  • 인터페이스는 다중 구현이 가능.
  • 인터페이스에 정의된 메서드는 구현되지 않은 추상 메서드.
  • implements 키워드로 구현.
  • 특정 기능만을 보장하거나 독립적으로 추가 가능.

예시

interface Flyable {
    void fly();
}

interface Swimable {
    void swim();
}

class Bird implements Flyable {
    public void fly() {
        System.out.println("The bird can fly.");
    }
}

class Duck implements Flyable, Swimable {
    public void fly() {
        System.out.println("The duck can fly.");
    }
    public void swim() {
        System.out.println("The duck can swim.");
    }
}

public class Main {
    public static void main(String[] args) {
        Duck duck = new Duck();
        duck.fly();  // Flyable 인터페이스 구현
        duck.swim(); // Swimable 인터페이스 구현
    }
}

3. 상속과 인터페이스의 차이

기준상속인터페이스
의미상위 클래스의 속성과 메서드 물려받음특정 행동(메서드) 구현 강제
관계is-a 관계can-do 관계
사용 방식extends 키워드 사용implements 키워드 사용
다중 사용단일 상속만 가능다중 구현 가능
목적코드 재사용 및 계층 구조행동(기능)의 계약 정의

4. 왜 굳이 나눠서 사용할까?

  1. 역할이 다름
    • 상속은 주로 재사용과 확장에 사용되며, 부모-자식 간 강한 연관성을 가집니다.
    • 인터페이스는 특정 기능 보장에 사용되며, 클래스 간 독립성을 유지할 수 있습니다.
  2. 다중 구현 지원
    • 자바는 다중 상속을 지원하지 않지만, 인터페이스를 통해 여러 행동을 구현 가능.
  3. 설계 유연성
    • 상속은 계층 구조를 만들지만, 인터페이스는 독립적인 기능들을 조합하여 클래스 설계를 유연하게 할 수 있습니다.

5. 언제 상속을 쓰고, 언제 인터페이스를 쓸까?

상속을 사용해야 할 때:

강한 is-a 관계가 성립될 때.
공통된 기능을 재사용하거나 확장할 때.
예: Vehicle → Car, Bike
인터페이스를 사용해야 할 때:

특정 동작만을 정의해야 할 때.
클래스가 서로 다른 계층에서 공통된 행동을 구현해야 할 때.
예: Flyable → Bird, Plane

6. 두 개념을 혼합해 사용 가능

예시

class Animal {
    void eat() {
        System.out.println("This animal eats food.");
    }
}

interface Flyable {
    void fly();
}

class Bird extends Animal implements Flyable {
    public void fly() {
        System.out.println("This bird can fly.");
    }
}

public class Main {
    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.eat(); // 상속된 메서드
        bird.fly(); // 인터페이스 구현 메서드
    }
}

결론

상속은 재사용과 확장에 중점을 두고, 인터페이스는 행동 보장에 중점을 둡니다.
유연한 설계를 위해 두 개념을 적절히 조합해 사용하는 것이 중요합니다.

profile
g2jkj0274@gmail.com

0개의 댓글