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

김서영·2024년 9월 25일
1

디자인 패턴

목록 보기
2/5

인터페이스 vs 추상클래스


추상 클래스인터페이스
사용 키워드abstractinterface
사용 가능한 변수제한 없음static final (상수)
사용 가능 접근 제어자제한 없음 (public, private, protected, default)public
사용 가능한 메소드제한 없음abstract method, default method, static method, private method
상속 키워드extendsimplements
다중 상속 가능 여부불가능가능 (클래스에 다중 구현, 인터페이스끼리 다중 상속)

공통점

  1. 추상 메소드를 가지고 있어야 한다.
  2. 인스턴스화 할 수 없다 (new 생성자 사용 X)
  3. 인터페이스 혹은 추상 클래스를 상속받아 구현한 구현체의 인스턴스를 사용해야 한다.
  4. 인터페이스와 추상클래스를 구현, 상속한 클래스는 추상 메소드를 반드시 구현하여야 한다.

✨ 인터페이스 정리

💠 내부의 모든 메서드는 public abstract로 정의
💠 내부의 모든 필드는 public static final 상수
💠 클래스에 다중 구현 지원
💠 인터페이스끼리는 다중 상속 지원
💠 인터페이스에도 static, default, private 제어자를 붙여 클래스같이 구체적인 메서드를 가질 수 있음
따라서 하위 멤버의 중복 메서드 통합을 어느정도 할 수 있지만, 필드는 상수이기 때문에 중복 필드 통합은 불가능
💠 인터페이스는 부모 자식 관계인 상속에 얽매이지 않고, 공통 기능이 필요할 때마다 추상 메서드를 정의해놓고 구현하는 식으로 추상클래스보다 자유롭게 붙였다 땟다 사용
💠 인터페이스는 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하는 것에 초점
💠 다중 구현이 된다는 점을 이용해, 내부 멤버가 없는 빈 껍데기 인터페이스를 선언해 마커 인터페이스로서 이용 가능
💠 보통 xxxable 형식으로 인터페이스 네이밍 규칙을 따름

✨ 추상클래스 정리

💠 추상클래스는 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스
💠 추상클래스는 다중 상속이 불가능하여 단일 상속만 허용
💠 추상클래스는 추상 메서드 외에 일반클래스와 같이 일반적인 필드, 메서드, 생성자를 가질 수 있다.
💠 이러한 특징으로, 추상클래스는 추상화(추상 메서드)를 하면서 중복되는 클래스 멤버들을 통합 및 확장할 수 있다.
💠 같은 추상화인 인터페이스와 다른점은, 추상클래스는 클래스간의 연관 관계를 구축하는 것에 초점을 둔다.

✨ 인터페이스 vs 추상클래스 사용처

💠 인터페이스 : implements라는 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현하는 느낌
💠 추상 클래스 : extends 키워드를 사용해서 자신의 기능들을 하위 클래스로 확장 시키는 느낌

✨ 추상클래스를 사용하는 경우

💠 상속 받을 클래스들이 공통으로 가지는 메서드와 필드가 많아 중복 멤버 통합을 할 때
💠 멤버에 public 이외의 접근자(protected, private) 선언이 필요한 경우
💠 non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메서드가 필요한 경우)
💠 요구사항과 함께 구현 세부 정보의 일부 기능만 지정했을 때
💠 하위 클래스가 오버라이드하여 재정의하는 기능들을 공유하기 위한 상속 개념을 사용할 때
💠 추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로, 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능들을 구현해야 할 경우 사용한다.

🔶 중복 멤버 통합

중복되는 멤버를 통합 해주는 기능은 본래 추상 클래스의 기능이라기 보단 그냥 클래스의 기능이라고 하는게 옳다.

다만 같은 추상화 개념인 인터페이스와 차이점을 두기 위해, 상수밖에 정의하지 못하는 인터페이스에서는 할 수 없는 기능이 추상 클래스 중복 멤버 통합이다.

class NewlecExam {
    int kor; // 중복되는 멤버
    int eng; // 중복되는 멤버
    int math; // 중복되는 멤버
    int com;

    void total(){} // 중복되는 멤버
    void avg(){} // 중복되는 멤버
}

class YBMExam{
    int kor; // 중복되는 멤버
    int eng; // 중복되는 멤버
    int math; // 중복되는 멤버
    int toeic;

    void total(){} // 중복되는 멤버
    void avg(){} // 중복되는 멤버
}

위의 다양한 종류의 Exam 시험 클래스의 공통적인 국어, 영어, 수학 멤버 필드를 상속을 통해 상위 클래스로 묶고 메서드도 통합하며 추상화를 해주면서 나중에 추가/확장에 유연한 구조를 만들 수 있다.

abstract class Exam {
    int kor;
    int eng;
    int math;

    abstract void total();
    abstract void avg();
}

class NewlecExam extends Exam {
    int com;

    void total(){}
    void avg(){}
}

class YBMExam extends Exam {
    int toeic;

    void total(){}
    void avg(){}
}
profile
개발과 지식의 성장을 즐기는 개발자

0개의 댓글