😎 이 글은 서로 비슷해보이는 자바의 인터페이스와 추상클래스 에 대해 다룹니다.
자바 버전이 업데이트 됨에따라 인터페이스 와 추상클래스 의 구분점이 점점 모호해 지고 공부하는 차원에서 작성한 글입니다.
틀린부분이 있다면 알려주세요 😏
자바 8 그리고 자바 9 자바 버전이 업그레이드 될수록 인터페이스 기능이 확장되면서 추상 클래스와 더 모호해 졌다고 느껴졋다.
기존 자바의 인터페이스는 추상적인 메소드를 만들면 인터페이스를 확장해서 사용하는 클래스는 반드시 해당 인터페이스의 메소드를 오버라이딩 해야했다. 하지만
이렇게 인터페이스의 기능확장 에 따라 개인적으로 추상클래스와 .. 뭐가 다른지 .. 모호해졌다. 😅
추상 클래스 와 인터페이스 모두 추상메서드를 선언할 수 있고 추상화를 달성하는데 사용된다. 추상 클래스와 인터페이스는 모두 인스턴스화 할 수 없다. (추상 클래스, 인터페이스만 단독으로 인스턴스가 될수없음 )
추상 클래스 | 인터페이스 |
---|---|
1. 추상 클래스는 추상 메서드와 비추상 메서드를 가질 수 있다. | 인터페이스는 추상 메서드와 default,static 메소드를 가질 수 있다. |
2. 추상 클래스는 다중 상속을 지원하지않는다.(Java 에서 는 클래스 단일상속만 가능) | 인터페이스는 다중 상속이 가능하다. |
3. (상태)추상 클래스는 비교적 자유로운 변수를 가질수 있다. | 인터페이스는 정적(static), 최종(final) 변수만 사용할수 있다. |
4. 추상 클래스를 확장할떄는 extend 키워드를 사용하여 확장합니다. | 인터페이스 를 확장할때는 implments 를 사용하여 구현합니다. |
추가적으로 인터페이스 가 인터페이스를 확장할때는 implements가 아닌 extends 를 사용한다.
// java의 Collection 프레임워크 예시
public interface List<E> extends Collection<E> {
int size();
boolean isEmpty();
boolean add(E e);
E remove(int index);
void clear();
}
추상클래스를 상속받은 클래스는 추상클래스와 is ~a 관계이고
인터페이스를 상속받은 클래스, 인터페이스는 상속받은 인터페이스와 has ~a 관계 라고 할 수 있다.
인터페이스 와 추상클래스는 대표적으로 상태를 가질수 있냐 없냐 로도 구분된다. (인터페이스의 경우 내부적으로 변수를 가지면 static,final 변수만 사용할 수 있기에 인스턴스마다 해당 변수로 이를 구현한 클래스에서 상태값으로 표시에는 제약이생긴다.)
개인적으로 추상클래스는 OOP에서 클래스의 추상화에 목적이 있다면 인터페이스는 추상화보다는 다형성 에 조금더 초점이 맞추어져 있다고 생각된다.
정리가 잘 된 글이네요. 도움이 됐습니다.