오늘도 난 존버한다

04 Interface 인터페이스 vs Inheritance 상속 본문

Java

04 Interface 인터페이스 vs Inheritance 상속

lunina 2024. 12. 18. 01:14

상속과 인터페이스는 둘 다 코드의 재사용성과 확장성을 높이기 위한 객체지향 프로그래밍(OOP)의 주요 개념이다. 하지만 목적과 사용 방식, 기능에서 차이가 있다.


1. 기본 개념

  Inheritance Interface
정의 superclass의 속성과 메서드를 subclass가 물려받아 재사용 특정 동작(메서드)의 구현을 강제하는 계약 역할
목적 코드 재사용 및 클래스 계층 구조 형성 클래스가 반드시 구현해야 할 메서드를 정의

 

2. 키워드와 구조

  Inheritance Interface
키워드 extends implements
다중 적용 클래스 간 단일 상속만 가능 다중 구현 가능
구성 요소 속성(필드)와 메서드 포함 가능 추상 메서드, 디폴트 메서드, 정적 메서드 (Java 8 이상)

 

3. 사용 범위

  Inheritance Interface
재사용성 부모 클래스의 속성과 메서드 상속 가능 메서드 구현은 없고 동작의 계약(설계)만 제공
구체적인 구현 여부 구현된 메서드와 필드를 그대로 상속 추상 메서드만 정의 (Java 8 이상에서는 일부 구현 가능)
설계 목적 클래스 간 계층적 관계 정의 (is-a 관계) 특정 동작(행동)을 구현하도록 강제 (can-do 관계)
유연성 제한적(단일 상속만 지원) 유연함(다중 인터페이스 구현 가능)

4. 기능적 차이

  Inheritance Interface
필드(속성) 부모 클래스의 필드 상속 가능 필드 사용 불가 (Java 8 이상에서는 public static final로 선언 가능)
접근 제어자 상속받는 메서드에 다양한 접근 제어자 사용 가능 인터페이스 메서드는 기본적으로 public abstract
다형성 부모 타입으로 자식 객체를 참조하여 다형성 사용 가능 인터페이스 타입으로 구현체를 참조하여 다형성 사용 가능

 

5. 다중 상속 관련

 

  Inheritance Interface
다중 상속 클래스의 다중 상속은 불가능 (extends로 하나의 부모 클래스만 상속 가능) 다중 인터페이스 구현 가능
충돌 문제 다중 상속 시 동일한 이름의 메서드가 여러 부모 클래스에 있다면 충돌 문제 발생 동일한 이름의 메서드가 여러 인터페이스에 있어도 구현 클래스에서 해결 가능


상속 예제

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 InheritanceExample {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();  // 부모 클래스의 메서드
        dog.bark(); // 자식 클래스의 메서드
    }
}
Buddy is eating.
Buddy says Woof!
  • 상속의 특징:
    • Dog 클래스는 Animal 클래스를 상속받아, Animal 클래스의 속성(name)과 메서드(eat())를 사용할 수 있다
    • 단일 상속만 가능하며, 부모 클래스의 기능을 확장합니다.
 단일상속이 뭘까?

단일 상속이란, 한 클래스가 오직 하나의 부모 클래스로부터만 상속받을 수 있다는 개념, 다중 상속(여러 부모 클래스를 동시에 상속받는 것)은 허용되지 않는다. 즉 extends 를 한개의 superClass 로 받아야 한다.


왜 단일 상속만 지원할까?

다중 상속은 코드 구조를 복잡하게 만들고, 충돌 문제가 발생할 가능성을 높인다.
예를 들어, 두 부모 클래스가 동일한 메서드 이름을 가진 경우 자식 클래스가 어떤 부모의 메서드를 사용할지 혼란이 생길 수 있습니다. 이를 다이아몬드 문제라고 한다.

자바는 이런 문제를 방지하기 위해 클래스 상속에서 단일 상속만 허용하고, 대신 인터페이스를 활용하여 다중 구현을 지원한다.

 


속성(Property)이란?

 

속성이란, 클래스가 가지는 데이터(변수), 자바에서 필드(Field) 또는 멤버 변수(Member Variable) 

class Car {
    // 속성 (필드)
    String brand;
    int speed;

    // 메서드
    void drive() {
        System.out.println(brand + " is driving at " + speed + " km/h.");
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.brand = "Tesla";   // 속성 설정
        car.speed = 120;       // 속성 설정
        car.drive();           // 출력: Tesla is driving at 120 km/h.
    }
}

 

 

단일 상속에서는 부모 클래스의 속성과 메서드가 자식 클래스에 상속된다.
예를 들어, 아래 코드에서 Dog 클래스는 Animal 클래스의 속성 name과 메서드 eat()를 그대로 사용할 수 있다.

class Animal {
    String name; // 속성 (Field)
    
    void eat() {
        System.out.println(name + " is eating.");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println(name + " says Woof!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "Buddy"; // 부모 클래스의 속성을 사용
        dog.eat();          // 부모 클래스의 메서드를 사용
        dog.bark();         // 자식 클래스의 메서드를 사용
    }
}

출력 결과

Buddy is eating.
Buddy says Woof!
  1. 단일 상속:
    • 자바에서 클래스는 오직 하나의 부모 클래스만 상속받을 수 있다.
    • 복잡성을 줄이고, 다중 상속에서 발생하는 문제를 방지하기 위함.
  2. 속성(Property):
    • 클래스 내에서 정의된 데이터(변수)를 말하며, 자바에서는 필드(Field)로 불린다.
    • 상속을 통해 부모 클래스의 속성도 자식 클래스에서 사용할 수 있다.

인터페이스 예제

interface Flyable {
    void fly(); // 추상 메서드
}

interface Swimmable {
    void swim(); // 추상 메서드
}

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

    public void swim() {
        System.out.println("The bird swims.");
    }
}

public class InterfaceExample {
    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.fly();
        bird.swim();
    }
}
  • 인터페이스의 특징:
    • Bird 클래스는 Flyable과 Swimmable 인터페이스를 모두 구현하여 다중 인터페이스 구현이 가능
    • fly()와 swim() 메서드의 구현을 강제

차이점

  Inheritance Interface
관계 is-a 관계 (상속 관계) can-do 관계 (행동 정의)
구성 요소 필드와 구현된 메서드 상속 가능 추상 메서드(필수), 디폴트/정적 메서드(Java 8 이상) 포함
다중 적용 가능 여부 단일 상속만 가능 다중 인터페이스 구현 가능
재사용성 부모 클래스의 구현된 코드 재사용 메서드의 설계 강제

결론

  • 상속코드 재사용계층적 관계를 형성하는 데 적합
  • 인터페이스구현 강제다형성을 강조하며, 다중 구현이 가능하여 더 유연하게 설계할 수 있다

'Java' 카테고리의 다른 글

06 Void?  (0) 2024.12.30
05 캡슐화란?  (0) 2024.12.29
03 인스턴스화하다? Instance  (2) 2024.12.17
02 추상 클래스에서 abstract 생략 가능?  (0) 2024.12.17
01 추상 클래스(Abstract Class)와 구상 클래스(Concrete Class)  (0) 2024.12.17