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

개인적으로 추상 클래스와 인터페이스가 비슷한 개념이라고 생각해 헷갈릴 때가 많았는데 이번에 두 클래스의 차이점에 대해 공부해 보자.

 

추상 클래스

추상 클래스는 인스턴스화할 수 없는 클래스로 다른 클래스에 의해 구현이 되도록 설계된 클래스이다.

abstract 키워드로 선언해야 하며, 추상 클래스에는 구현체가 존재하지 않는 추상 메서드가 하나 이상 포함이 되어야 한다. 그렇다고 추상 클래스에는 추상 메서드만 존재하는 것이 아니라 일반적인 메서드, 생성자, 필드를 가질 수 있다.

추상 메서드는 메서드가 선언이 되었지만 구현이 없는 메서드이다.

 

추상 클래스의 하위 클래스는 추상 클래스 안에 있는 모든 추상 메서드를 구현해야 한다는 특징이 있다.

 

추상 클래스의 예시 코드를 살펴보자.

 

추상 클래스 Animal

public abstract class Animal {
    public String name;

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

    public void eat() {
        System.out.println(name + " is eating!");
    }

    public abstract void makeSound();
}

Animal 추상 클래스에는 추상 메서드(makeSound)뿐만 아니라 필드(name), 생성자, 일반 메서드(eat)가 존재한다. 

 

 

Animal 하위 클래스 Dog

public class Dog extends Animal{
    public Dog(String name) {
        super(name);
    }

    @Override
    public void makeSound() {
        System.out.println(name + " is barking!");
    }
}

 

추상 클래스의 하위 클래스인 Dog 클래스는 추상 메서드 makeSound를 구체화시켰다.

 

public class AbstractClass {
    public static void main(String[] args) {
        Dog dog = new Dog("Choco");
        dog.eat();         //  Choco is eating!
        dog.makeSound();   //  Choco is barking!
    }
}

 

Dog 객체를 생성하고 eat 메서드와, 구체화된 makeSound 메서드를 실행해 보면 정상적으로 실행되는 것을 확인할 수 있다.

 

추상 클래스의 특징

  • 추상 클래스는 인스턴스화할 수 없는 클래스로 해당 클래스의 객체를 직접 만들 수 없다.
  • 추상 클래스에는 추상 메서드뿐만 아니라 비추상 메서드도 포함될 수 있다.
  • 추상 클래스의 하위 클래스는 추상 클래스 안에 있는 모든 추상 메서드를 구현해야 한다

 

인터페이스

인터페이스는 추상 클래스와 마찬가지로 인터페이스의 구현 클래스는 모든 추상 메서드를 구현해야 하지만 추상 클래스와 다르게 모든 메서드가 추상 메서드여야 한다. 그리고 추상 클래스와 다르게 다중 구현이 가능하다는 특징도 존재한다.

인터페이스 예시 코드도 살펴보자.

인터페이스 Animal

public interface Animal {
    void breathing();
    void eat();
}

Animal 인터페이스에는 구현되지 않은 두 개의 메서드(breathing(), eat())가 존재한다. 이 인터페이스를 구현하는 클래스는 두 개의 메서드를 모두 구현해야 한다.

 

구현 클래스 Dog

public class Dog implements Animal {
    public void breathing() {
        System.out.println("breathing..");
    }
    
    public void eat() {
        System.out.println("eating!");
    }
}

Animal을 구현하는 클래스 Dog는 추상 메서드 breathing()과 eat()을 구체화시켜 사용하고 있다.

 

 

인터페이스의 특징

  • 인터페이스는 인스턴스화할 수 없으며 모든 메서드가 추상 메서드여야 한다.
  • 인터페이스는 다중 상속이 가능하다. (다형성)
  • 인터페이스는 생성자 생성이 불가능하다.
  • 인터페이스를 구현하는 자식 클래스는 인터페이스의 추상 메서드를 모두 구현해야 한다.

 

추상 클래스와 인터페이스의 차이점

추상 클래스와 인터페이스 둘 다 하위 클래스가 추상 메서드를 구현하는 특징을 갖고 있는데 정확히 어떤 차이점이 있는지 알아보고 각각 상황에 맞게 사용하자.

 

  • 추상 클래스는 추상 메서드와 비추상 메서드를 모두 가질 수 있는 반면 인터페이스는 추상 메서드만 가질 수 있다.
  • 클래스는 하나의 추상 클래스만 확장할 수 있는 반면에 여러 인터페이스를 구현할 수 있다.
  • 추상 클래스는 생성자를 가질 수 있지만 인터페이스는 생성자를 가질 수 없다.