Java - 인터페이스 vs 상속

박민수·2024년 6월 13일
0

Java

목록 보기
13/13
post-thumbnail

개요

자바 프로그래밍에서 상속과 인터페이스는 객체지향 프로그래밍의 핵심 개념 중 하나이다. 이 두 가지 개념은 코드의 재사용성을 높이고, 유연하고 확장 가능한 소프트웨어를 작성하는 데 중요한 역할을 한다. 이 글에서는 인터페이스와 상속의 차이에 대해 정리해 보고자 한다.

상속(Inheritance)이란?

상속은 객체지향 프로그래밍에서 기존 클래스의 속성과 메서드를 새로운 클래스에게 물려주는 것을 의미한다. 상속을 통해 자식 클래스는 부모 클래스의 모든 멤버 변수와 메서드를 사용할 수 있으며, 필요에 따라 추가적인 멤버를 정의하거나 기존 메서드를 오버라이딩 할 수 있다.

사용 예시

  • 아래 예시에서 Dog 클래스는 Animal 클래스를 상속받아 eat 메서드를 재정의하고, bark라는 새로운 메서드를 추가했다. 이렇게 상속을 사용하면 기존 코드를 재사용하면서도 새로운 기능을 추가하거나 기존 기능을 수정할 수 있다.
// 부모 클래스
class Animal {
    String name;

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

    public void sleep() {
        System.out.println("This animal sleeps.");
    }
}

// 자식 클래스
class Dog extends Animal {
    // 자식 클래스에서 추가한 메서드
    public void bark() {
        System.out.println("The dog barks.");
    }

    // 부모 클래스의 메서드를 재정의
    @Override
    public void eat() {
        System.out.println("The dog eats dog food.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "Buddy";
        dog.eat();  // The dog eats dog food.
        dog.sleep();  // This animal sleeps.
        dog.bark();  // The dog barks.
    }
}

인터페이스(interface)란?

인터페이스는 클래스가 구현해야 하는 메서드의 집합을 정의하는데 사용된다. 인터페이스는 실제 구현은 제공하지 않으며, 메서드의 시그니처(이름, 반환 타입, 매개변수 목록)만을 정의한다. 클래스는 인터페이스를 구현함으로써 해당 인터페이스에 정의된 모든 메서드를 반드시 구현해야 한다.

사용 예시

  • 아래 예시에서 Dog 클래스는 Animal 인터페이스를 구현하여 eat과 sleep 메서드를 정의했다. 인터페이스를 사용하면 클래스가 특정 메서드를 구현하도록 강제할 수 있다.
// 인터페이스
interface Animal {
    void eat();
    void sleep();
}

// 인터페이스를 구현한 클래스
class Dog implements Animal {
    @Override
    public void eat() {
        System.out.println("The dog eats dog food.");
    }

    @Override
    public void sleep() {
        System.out.println("The dog sleeps.");
    }

    // 추가 메서드
    public void bark() {
        System.out.println("The dog barks.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();  // The dog eats dog food.
        dog.sleep();  // The dog sleeps.
        dog.bark();  // The dog barks.
    }
}

※ 참고 - 인터페이스와 추상 클래스의 차이

인터페이스

  • 인터페이스는 클래스가 반드시 구현해야 하는 메서드의 집합을 정의하며, 이를 통해 다중 구현을 지원하여 하나의 클래스가 여러 인터페이스를 구현할 수 있게 한다.
  • 인터페이스 내의 멤버 변수는 기본적으로 public static final로 선언된 상수이며, 생성자를 가질 수 없다.

추상 클래스

  • 추상 클래스는 일부 메서드를 구현할 수 있는 기본 클래스로, 인스턴스 변수를 가질 수 있으며 다양한 접근 제어자를 사용할 수 있다.
  • 추상 클래스는 단일 상속만 지원하며, 하나의 추상 클래스만 상속받을 수 있다. 또한, 추상 클래스는 생성자를 가질 수 있어 자식 클래스에서 이를 호출할 수 있다.

차이점

개념적인 차이

  • 상속은 클래스 간의 부모-자식 관계를 정의하여 코드 재사용성을 높이는 반면, 인터페이스는 클래스가 구현해야 하는 메서드 집합을 정의하여 일관성을 유지한다.
  • 상속은 단일 상속만 지원하는 반면, 인터페이스는 다중 구현을 지원한다. 즉, 한 클래스는 여러 개의 인터페이스를 구현할 수 있다.

사용 목적의 차이

  • 상속은 주로 기존 클래스의 기능을 확장하거나 수정할 때 사용되며, 인터페이스는 특정 기능을 클래스에 강제할 때 사용된다.
  • 상속은 부모 클래스의 구현을 물려받기 때문에 코드 중복을 줄이고 유지보수를 쉽게 한다. 반면, 인터페이스는 구현을 제공하지 않기 때문에 클래스가 특정 계약을 준수하도록 강제한다.

코드 구조의 차이

  • 상속에서는 extends 키워드를 사용하며, 부모 클래스의 메서드를 재정의할 수 있다.
  • 인터페이스에서는 implements 키워드를 사용하며, 인터페이스에 정의된 모든 메서드를 반드시 구현해야 한다.

결론

자바에서 상속과 인터페이스는 각각 다른 목적과 용도로 사용된다. 상속은 코드 재사용성과 확장성을 높이기 위해 사용되며, 인터페이스는 클래스 간의 일관성을 유지하고 특정 기능을 강제하기 위해 사용된다. 이 두 가지 개념을 적절히 활용하면 더욱 유연하고 유지보수하기 쉬운 소프트웨어를 작성할 수 있다.

profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보