인터페이스와 추상클래스

정체는 김태현·2022년 10월 19일
0

항해99

목록 보기
25/38

추상 클래스는 클래스 내 ‘추상 메서드’가 하나 이상 포함되거나 abstract로 정의된 경우를 말함.
반면 인터페이스는 모든 메서드가 추상 메서드인 경우를 말함.

존재 목적에서 가장 큰 차이를 보인다.
추상 클래스는 그 추상 클래스를 상속 받아서 기능을 이용하고, 확장시키는 데 있다. (다중 상속의 모호성 때문에 하나만 상속 가능)
반면 인터페이스는 함수의 껍데기만 있어, 함수의 구현을 강제한다. 구현을 강제함으로써 구현 객체의 같은 동작을 보장할 수 있다.



추상클래스란?

추상클래스는 일반 클래스와 별 다를 것이 없다. 단지, 추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스이다. 그래서 미완성 설계도라고도 표현한다. 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없다.

class 앞에 "abstract" 예약어를 사용하여 상속을 통해서 구현해야한다는 것을 알려주고 선언부만 작성하는 추상메서드를 선언할 수 있다.

abstract class 클래스이름 {
    ...
    public abstract void 메서드이름();
}

인터페이스란?

추상클래스가 미완성 설계도라면 인터페이스는 기본 설계도라고 할 수 있다. 인터페이스도 추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중상속(구현)이 가능하다.

interface 인터페이스이름 {
    public static final 상수이름 = 값;
    public abstract void 메서드이름();
}

추상클래스 VS 인터페이스 차이점

추상클래스와 인터페이스의 공통점은 추상메서드를 사용할 수 있다는 것이다. 그럼 왜 굳이 2가지로 나눠서 사용할까? 추상클래스와 인터페이스의 기능들을 살펴보면 추상클래스가 인터페이스의 역할을 다 할 수 있는데 왜 굳이 인터페이스라는게 있는 걸까?

이론적인 차이점을 다 제외하고 두개로 나눠서 사용하는 가장 큰 차이점은 사용용도라고 생각한다.

사용의도 차이점

추상클래스는 IS - A "~이다".

인터페이스는 HAS - A "~을 할 수 있는".

이렇게 구분하는 이유는 다중상속의 가능 여부에 따라 용도를 정한 것 같다. 자바의 특성상 한개의 클래스만 상속이 가능하여 해당 클래스의 구분을 추상클래스 상속을 통해 해결하고, 할 수 있는 기능들을 인터페이스로 구현한다.

공통된 기능 사용 여부

만약 모든 클래스가 인터페이스를 사용해서 기본 틀을 구성한다면... 공통으로 필요한 기능들도 모든 클래스에서 오버라이딩 하여 재정의 해야하는 번거로움이 있다. 이렇게 공통된 기능이 필요하다면 추상클래스를 이용해서 일반 메서드를 작성하여 자식 클래스에서 사용할 수 있도록 하면 된다. 어!? 그러면 그냥 추상클래스만 사용하면 되는 거 아닌가? 위에서 얘기 했듯이 자바는 하나의 클래스만 상속이 가능하다. 만약 각각 다른 추상클래스를 상속하는데 공통된 기능이 필요하다면? 해당 기능을 인터페이스로 작성해서 구현하는게 편하다.

정리

추상클래스 사용 시기 : 상속 관계를 쭉 타고 올라갔을때 같은 조상클래스를 상속하는데 기능까지 완전히 똑같은 기능이 필요한 경우

인터페이스 사용 시기 : 상속 관계를 쭉 타고 올라갔을때 다른 조상클래스를 상속하는데 같은 기능이 필요할 경우 인터페이스 사용

출처: https://myjamong.tistory.com/150

profile
하나부터 열가지 다

0개의 댓글