[java] 자바 추상 클래스와 인터페이스의 공통점

자바에서 추상 클래스와 인터페이스는 모두 추상화를 위한 도구로 사용되는 개념입니다. 추상 클래스와 인터페이스는 각각의 목적과 사용 방법이 다르지만, 몇 가지 공통된 특징이 있습니다.

1. 추상화를 위한 선언

추상 클래스와 인터페이스는 모두 추상화를 위한 선언이라는 공통점이 있습니다. 추상 클래스는 클래스의 일부 메소드가 구현되지 않고 추상 메소드로 선언된 클래스이며, 인터페이스는 모든 메소드가 추상 메소드로 선언된 인터페이스입니다.

예를 들어, 추상 클래스인 Animal 클래스와 인터페이스인 Flyable 인터페이스는 모두 추상화를 위해 선언됩니다.

public abstract class Animal {
    public abstract void eat();
    public abstract void sleep();
}

public interface Flyable {
    void fly();
}

2. 다형성 지원

추상 클래스와 인터페이스는 다형성을 지원한다는 공통점이 있습니다. 추상 클래스와 인터페이스를 상속받은 클래스나 인터페이스는 다양한 형태로 사용될 수 있습니다.

예를 들어, Bird 클래스는 Animal 추상 클래스를 상속받아 추상 메소드인 eatsleep를 구체적으로 구현하고, Flyable인터페이스를 구현하여 fly 메소드를 구현할 수 있습니다.

public class Bird extends Animal implements Flyable {
    @Override
    public void eat() {
        System.out.println("새가 먹는다");
    }
    
    @Override
    public void sleep() {
        System.out.println("새가 잔다");
    }
    
    @Override
    public void fly() {
        System.out.println("새가 난다");
    }
}

3. 인스턴스화 불가능

추상 클래스와 인터페이스는 직접적인 인스턴스화가 불가능하다는 공통점이 있습니다. 추상 클래스는 추상 메소드를 가지고 있기 때문에, 이를 구체적으로 구현한 클래스를 통해 인스턴스를 생성해야 합니다. 인터페이스 역시 메소드의 구현이 없기 때문에, 인터페이스를 구현한 클래스를 통해 인스턴스를 생성해야 합니다.

예를 들어, 위에서 정의한 Bird 클래스는 Animal 클래스의 구체적인 구현과 Flyable 인터페이스의 구체적인 구현을 갖고 있기 때문에, Bird 클래스의 인스턴스를 생성하여 사용해야 합니다.

Bird bird = new Bird();
bird.eat();
bird.sleep();
bird.fly();

4. 다중 상속 불가능

자바에서는 다중 상속을 지원하지 않습니다. 따라서 추상 클래스와 인터페이스 모두 하나의 클래스나 인터페이스에서만 상속이 가능합니다.

예를 들어, Bird 클래스는 Animal 추상 클래스를 상속받고, Flyable 인터페이스도 구현하였지만, Bird 클래스는 다른 클래스나 인터페이스로부터 상속을 받을 수 없습니다.

결론

자바의 추상 클래스와 인터페이스는 추상화를 위한 도구로 사용되지만, 몇 가지 공통점을 가지고 있습니다. 추상화를 통해 객체를 추상적으로 다룰 수 있고, 다형성을 지원하여 유연한 코드 작성이 가능합니다. 경험적으로 다른 객체지향 프로그래밍 언어에서도 이러한 개념들이 유사하게 적용되기 때문에, 주요 개념으로 알아두는 것이 좋습니다.

참고문헌