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

basic

추상클래스와 인터페이스의 차이 및 존재 이유

클래스는 크게 일반클래스와 추상클래스로 나뉜다. 추상클래스는 클래스 내 ‘추상 메소드’가 하나 이상 포함되거나 abstract로 정의된 경우를 말한다. 반면 인터페이스는 모든 메소드가 추상 메소드인 경우이다.(자바 8에서는 default 키워드를 이용해서 일반 메소드의 구현 가능)

두 개념의 차이는 너무나 명확하다. 일단 생김새도 다르고, 사용하는 방법도 다르다. 그렇지만 하는일은 비슷하다.

추상클래스와 인터페이스는 상속받는 클래스 혹은 구현하는 인터페이스 안에 있는 추상메소드를 강제한다.

이 ‘하는 일’ 을 한번 생각해보면 결국 추상메소드를 구현 하는것이다. 그렇다면 추상클래스 하나만 존재하되, 추상 클래스 안에 추상 메소드를 여러개 두거나 혹은 전부 추상 메소드만 두면 될텐데 왜 인터페이스가 존재하는 것 일까?

결론부터 말하자면 인터페이스와 추상 클래스의 존재 목적이 다르다. 추상클래스는 그 추상클래스를 상속받아서 기능을 이용하고, 확장시키는데 있다. 반면 인터페이스의 경우 메소드의 껍데기만 있는데 그 이유는 그 메소드의 구현을 강제하기 위해서이다. 구현을 강제함으로써 구현 객체의 같은 동작을 보장할 수 있다.

이렇게 애매하지만 명확하게 다른 존재 이유가 있는데, 서로 상호 보완적인 면이 나타나는 이유는 무엇일까?

바로 자바가 다중상속을 지원하지 않기 때문이다. 다중 상속은 아래와 같이 여러개의 슈퍼클래스를 두는것을 말한다.

    class MyVehicle extends Car, Plane {
            @Override
            public void goTo() {

                super.drive();
            }
    }

위와 같은 코드에서 car,plane 클래스 모두 drive() 라는 메소드를 가지고 있다면 어떤 메소드가 실행될까? 이것이 바로 다중 상속의 모호성이다. 이 다중 상속의 모호성 때문에 자바는 과감하게 다중 상속을 못하도록 해버렸다.

이와는 다르게 인터페이스는 아래와 같이 여러개의 인터페이스를 구현할 수 있다.

    class Car implements Vehicle,Engine {
        @Override
        public void drive() {
            @doSomething
        }
    }

마치 여러개를 상속받는 것 처럼 보인다. 그래서 추상클래스의 상속과 헷갈릴 수 있다. 이렇게 외관상 헷갈리게 생긴것 말고도, 둘 다 추상메소드를 가지고 있다는 점 때문에 인터페이스가 다중 상속의 문제점을 해결하기 위해 존재한다는 오해를 사기도 한다.

이 오해를 풀기위해선 다시 한번 두 개념의 존재 이유를 되새겨 볼 필요가 있다.

상속은 슈퍼클래스의 기능을 이용하거나 확장하기 위해서 사용되고, 다중 상속의 모호성 때문에 하나만 상속받을 수 있다.

반면 인터페이스는 해당 인터페이스를 구현한 객체들에 대해서 동일한 동작을 약속하기 위해 존재한다.

효준's profile image

효준

2019-04-23 13:00

다른글 보러가기

비동기식 프로그래밍에서 Call stack이 동기식 프로그램의 그것과 다른 이유는?

이전 포스트

REST, REST API, RESTFUL

다음 포스트