추상클래스는 한 개 이상의 추상 메서드를 가지는 클래스로,
선언만 되며 구현이 되지 않은 불완전한 메서드이므로 객체로 생성되지 않습니다.
여기서 추상메서드란 내용이 없는 메서드로 구현은 하지 않고 선언만 한 메서드입니다.
추상 메서드를 사용하기 위해 반드시 자식 클래스에서 해당 메서드를 재정의해야합니다.
* 인스턴스 변수, 클래스 변수, 생성자, 클래스 메소드, 일반 메소드 선언 및 구현 가능
* 사용 목적 : 공통된 필드, 메소드의 이름 통일과 구체화 클래스 작성시 시간 절약을 위해서
추상클래스 선언
클래스를 선언할때 abstract 키워드를 사용합니다.
new 연산자로 객체를 생성하지 못하고 상속을 통해 자식 클래스만 생성 가능합니다.
public abstract class 클래스명 {
}
추상 메소드 선언
// 추상 클래스에서 선언
public abstract void 메소드명();
// 상속 받은 자식 클래스
@Override
public abstract void 동일메소드명(){
//구체화한 실행 내용
}
인터페이스
추상 메서드와 상수로만 이루어져 있습니다. public이나 private등 접근 제한자를 둘 수 없으며, 구현부가 없어서 상속받는 클래스들이 각각을 재정의해주어야합니다.
인터페이스 또한 인스턴스를 생성할 수 없습니다.
특이한 점은 인터페이스는 인터페이스를 다중 상속받을 수 있습니다.
public interface 인터페이스명{
// void 추상메소드1();
// void 추상메소드2();
}
public interface 인터페이스명 extends 상속받을 인터페이스1, 상속받을 인터페이스2{
void 추상메서드();
}
=> 인터페이스에 있는 모든 메서드들은 추상 메서드로 간주되기 때문에 abstract키워드를 적지 않는다고 합니다.
그리고 기존에 인터페이스에서 일반 메서드를 구현할 수 없었지만 자바 8버전부터 default 예약어를 통해 일반 메서드 구현이 가능하다고 합니다.
추상클래스와 인터페이스 비교
추상 클래스와 인터페이스의 공통점
1. 선언만 있고 구현 내용은 없습니다.
2. new를 통해 객체를 생성할 수 없으며, 대신 상속받은 자식만이 객체를 생성할 수 있습니다.
3. 상속받은 자식이 메서드 구현을 반드시 하도록 합니다.
추상 클래스와 인터페이스의 차이점
1. 추상클래스의 목적은 기능을 사용하고 확장을 위해 사용한다면 인터페이스는 구현 객체의 같은 동작을 보장하기 위해 사용합니다. ( 확장성 vs 강제성)
2. 추상클래스는 다중 상속이 불가능하지만 인터페이스는 다중 상속이 가능합니다.
3. 추상클래스는 일반 메소드 선언 및 구현, 추상메서드 선언이 가능합니다. 하지만 인터페이스는 상수와 추상메서드 선언만 가능합니다. (일반변수 + 일반메서드 + 추상 메서드 vs 상수 + 추상메서드)
4. 추상 클래스는 생성자와 일반 변수 모두 가질 수 있지만 인터페이스는 생성자와 일반 변수 모두 비허용합니다.
5. 일반 메서드 및 생성자의 구현은 허용하지만 인터페이스는 메서드 선언만 가능합니다.
참고하면 좋은 글)
https://hwan1402.tistory.com/84