추상 클래스는 클래스지만, 이를 기반으로 인스턴스 생성이 불가능하며 하나 이상의 추상 메서드를 포함할 수 있는 클래스이다. 오직 상속을 통해 하위 클래스에서만 완성될 수 있다.
추상화?
공통적인 속성과 기능을 정의함으로써 코드 중복을 줄이고 클래스 간 관계를 효과적으로 설정하고 유지/보수를 용이하게 하는 것
하지만, 클래스 역할을 하지 못하는 추상 클래스를 사용하는 이유는 무엇일까?
새로운 클래스를 작성하는데 바탕이 되어주기 때문이다. 추상클래스라는 틀에서 공통적인 기능을 공유하는 클래스들 간의 공통 로직을 제공함으로써 확장이 편리하며 유연함을 가져주기 때문이다.
abstract class test{
...
}
abstract 키워드를 사용해 추상 클래스를 정의하며 위와 같이 클래스 선언부가 작성되어 있으면 미완성 추상 클래스이므로 상속을 통해 내부의 추상 메서드를 구현해줘야 한다.
또한, 구현된 메서드와 구현되지 않은 추상 메서드를 함께 가질 수 있다.
인터페이스는 모든 메서드가 추상 메서드인 경우이며 함수의 구현을 강제하기 위해 사용된다. interface 키워드를 통해 구현하며 오직 추상 메서드와 상수로만 이루어진다.
public abstract여야 함 -> 생략 가능public static final로 정의되나 키워드 생략 가능implements하는 일반 클래스는 모든 메서드를 반드시 구현해야 함class 클래스명 implements 인터페이스명{
추상메서드 구현
}
만약 구현하는 인터페이스 메서드 중 일부만 구현할 시, abstract 키워드를 사용해 추상 클래스로 선언해야 한다.
abstract class 클래스명 implements 인터페이스명{
추상메서드 구현
}
| 구분 | 추상 클래스 | 인터페이스 |
|---|---|---|
| 목적 | 여러 클래스가 공통으로 사용할 기능을 미리 구현하고 필요한 부분만 자식 클래스에서 완성하도록 제공 | 클래스들이 반드시 구현해야 할 메서드 목록을 정의해 동일한 동작 방식 강제 |
| 상속/구현 | 단일 상속 | 다중 상속 |
| 구성 요소 | 추상 메서드+일반 메서드+멤버 변수+생성자 모두 포함 가능 | 추상 메서드, default/static 메서드, 상수만 포함 |
| 멤버 변수 | 인스턴스 변수, 상수 모두 가능 | 상수(public static final)만 선언 가능 |
| 메서드 구현 | 일부 메서드 미리 구현 가능 | 구현 불가 |
| 생성자 | 존재 | 존재 X |