[Java] 인터페이스 와 추상클래스

FeelingXD·2023년 8월 16일
0

JAVA

목록 보기
3/4
post-thumbnail

😎 이 글은 서로 비슷해보이는 자바의 인터페이스와 추상클래스 에 대해 다룹니다.

들어가며..

자바 버전이 업데이트 됨에따라 인터페이스 와 추상클래스 의 구분점이 점점 모호해 지고 공부하는 차원에서 작성한 글입니다.
틀린부분이 있다면 알려주세요 😏

자바 8 그리고 자바 9 자바 버전이 업그레이드 될수록 인터페이스 기능이 확장되면서 추상 클래스와 더 모호해 졌다고 느껴졋다.

기존 자바의 인터페이스는 추상적인 메소드를 만들면 인터페이스를 확장해서 사용하는 클래스는 반드시 해당 인터페이스의 메소드를 오버라이딩 해야했다. 하지만

자바 8 에서 인터페이스 변화

  • 인터페이스가 default 접근자를 사용하여서 상속받은 클래스에서 오버라이딩 되지 않았다면 기본적으로 실행할 메서드 동작을 정의 할수있게 되었다.

자바 9 에서 인터페이스 변화

  • 인터페이스에서 private 접근자를 사용한 메서드를 사용할수있도록 추가되었다.

이렇게 인터페이스의 기능확장 에 따라 개인적으로 추상클래스와 .. 뭐가 다른지 .. 모호해졌다. 😅

추상 클래스와 인터페이스

공통점

추상 클래스 와 인터페이스 모두 추상메서드를 선언할 수 있고 추상화를 달성하는데 사용된다. 추상 클래스와 인터페이스는 모두 인스턴스화 할 수 없다. (추상 클래스, 인터페이스만 단독으로 인스턴스가 될수없음 )

차이점

추상 클래스인터페이스
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에서 클래스의 추상화에 목적이 있다면 인터페이스는 추상화보다는 다형성 에 조금더 초점이 맞추어져 있다고 생각된다.

참고한글들

profile
tistory로 이사갑니다. :) https://feelingxd.tistory.com/

1개의 댓글

comment-user-thumbnail
2023년 8월 16일

정리가 잘 된 글이네요. 도움이 됐습니다.

답글 달기