추상 클래스 | 인터페이스 | |
---|---|---|
사용 키워드 | abstract | interface |
사용 가능한 변수 | 제한 없음 | static final (상수) |
사용 가능 접근 제어자 | 제한 없음 (public, private, protected, default) | public |
사용 가능한 메소드 | 제한 없음 | abstract method, default method, static method, private method |
상속 키워드 | extends | implements |
다중 상속 가능 여부 | 불가능 | 가능 (클래스에 다중 구현, 인터페이스끼리 다중 상속) |
💠 내부의 모든 메서드는 public abstract
로 정의
💠 내부의 모든 필드는 public static final
상수
💠 클래스에 다중 구현 지원
💠 인터페이스끼리는 다중 상속 지원
💠 인터페이스에도 static
, default
, private
제어자를 붙여 클래스같이 구체적인 메서드를 가질 수 있음
따라서 하위 멤버의 중복 메서드 통합을 어느정도 할 수 있지만, 필드는 상수이기 때문에 중복 필드 통합은 불가능
💠 인터페이스는 부모 자식 관계인 상속에 얽매이지 않고, 공통 기능이 필요할 때마다 추상 메서드를 정의해놓고 구현하는 식으로 추상클래스보다 자유롭게 붙였다 땟다 사용
💠 인터페이스는 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하는 것에 초점
💠 다중 구현이 된다는 점을 이용해, 내부 멤버가 없는 빈 껍데기 인터페이스를 선언해 마커 인터페이스로서 이용 가능
💠 보통 xxxable
형식으로 인터페이스 네이밍 규칙을 따름
💠 추상클래스는 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스
💠 추상클래스는 다중 상속이 불가능하여 단일 상속만 허용
💠 추상클래스는 추상 메서드 외에 일반클래스와 같이 일반적인 필드, 메서드, 생성자를 가질 수 있다.
💠 이러한 특징으로, 추상클래스는 추상화(추상 메서드)를 하면서 중복되는 클래스 멤버들을 통합 및 확장할 수 있다.
💠 같은 추상화인 인터페이스와 다른점은, 추상클래스는 클래스간의 연관 관계를 구축하는 것에 초점을 둔다.
💠 인터페이스 : 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(){}
}