Server

[Java] 추상 클래스와 인터페이스의 차이

devhyen 2024. 7. 12. 13:25

추상클래스와 인터페이스는 모두 추상화를 통해 다형성을 구현하는 방법을 제공하지만
각각의 특징에 따른 차이점이 존재한다.

 

여기서 다형성이란,

객체에 여러가지 타입을 대입할 수 있다는 것을 의미한다. ↔ 단형성은 하나의 객체에 하나의 타입만 대응 가능하다.


추상 클래스 Abstract Class

abstract class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    abstract void makeSound(); // 추상 메서드

    void eat() {
        System.out.println(name + " is eating."); // 일반 메서드
    }
}

 

abstract 키워드를 사용하여 정의한다.
일반 메서드와 추상 메서드를 모두 포함할 수 있다.

  • 일반 메서드는 구현이 제공되며, 하위 클래스에서 필요에 따라 오버라이드 할 수 있다.
  • 추상 메서드는 구현이 없는 메서드이며, abstract키워드를 사용하여 정의하며, 하위 클래스에서 반드시 구현해야 한다.

추상메서드는 직접적으로 인스턴스화 할 수 없다. 즉 new 키워드를 사용해서 객체를 생성할 수 없다.

 

다중 상속 불가

  • Java는 단일 상속만을 지원하기 때문에, 추상 클래스는 하나의 클래스만을 상속할 수 있다.

필드(멤버 변수)를 가질 수 있고, 생성자를 정의할 수 있으며, 상속을 통해 재사용 할 수 있다.

 

사용 하는 경우

클래스들 사이에 공통적인 로직을 재사용하고자 할 때
is-a 관계를 나타내는 경우

 


인터페이스 Interface

interface Vehicle {
    void start(); // 추상 메서드

    void stop(); // 추상 메서드
}

class Car implements Vehicle {
    @Override
    public void start() {
        System.out.println("Car is starting.");
    }

    @Override
    public void stop() {
        System.out.println("Car is stopping.");
    }
}

 

abstract 키워드를 사용하여 정의한다.

추상 메서드와 상수를 포함할 수 있지만, 일반 메서드의 구현은 허용되지 않는다.

  • 모든 메서드는 기본적으로 추상메서드
  • 메서드 선언만 있고 구현은 없다.
  • Java8 부터는 default methodstatic method를 지원하기 시작했다.
  • 인터페이스는 상수를 가질 수 있으며, 자동으로 public static final로 설정된다.

다중 구현

  • 클래스는 여러개의 인터페이스를 구현할 수 있다. 이는 다중 상속과 유사한 효과를 제공한다.

인터페이스는 직접적으로 인스턴스화할 수 없다.

 

오버라이드

인터페이스를 구현하는 클래스는 인터페이스의 모든 추상 메서드를 반드시 오버라이드 해야한다.

 

사용 하는 경우

클래스가 어떤 행위를 할 수 있는 지 정의하고자 할 때
여러 클래스에 걸쳐 동작이 일관되게 구현되어야 하는 경우
다른 클래스와의 결합도를 낮추고자 할 때