[JAVA] 인터페이스(Interface)와 추상클래스(abstract Class)의 차이

DANI·2023년 10월 5일
0

JAVA를 공부해보자

목록 보기
11/29
post-thumbnail

📕 추상클래스(abstract Class)란?

추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스로 미완성 설계도라고도 표현한다. 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없다.


📕 인터페이스(interface)란?

추상클래스가 미완성 설계도라면 인터페이스는 기본 설계도라고 할 수 있다. 인터페이스도 추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적으로 작성하고 클래스와 다르게 다중상속(구현)이 가능합니다.


📝 인터페이스 vs 추상클래스

✅ 1. 사용의도 차이점

  • 추상클래스 : IS - A "~이다"
    - 자식 클래스 is kind of 부모 클래스
    - extends 키워드를 사용해서 자신의 기능들을 하위 클래스로 확장

  • 인터페이스 : HAS - A "~을 할 수 있는"
    - 자식 클래스 is able to 부모 인터페이스
    - implements 라는 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현

이렇게 구분하는 이유는 다중상속의 가능 여부에 따라 용도를 정한 것이다. 자바의 특성상 한개의 클래스만 상속이 가능하여 해당 클래스의 구분을 추상클래스 상속을 통해 해결하고, 할 수 있는 기능들을 인터페이스로 구현한다.

✅ 2. 공통된 기능 사용 여부

만약 공통된 기능이 필요하다면 추상클래스를 이용해서 일반 메서드를 작성하여 자식 클래스에서 사용할 수 있도록 하면 된다. 만약 각각 다른 추상클래스를 상속하는데 공통된 기능이 필요하다면? 해당 기능을 인터페이스로 작성해서 구현한다.

  • 추상클래스 사용 시기 : 상속 관계를 쭉 타고 올라갔을때 같은 조상클래스를 상속하는데 기능까지 완변히 똑같은 기능이 필요한 경우

  • 인터페이스 사용 시기 : 상속 관계를 쭉 타고 올라갔을때 다른 조상클래스를 상속하는데 같은 기능이 필요할 경우 인터페이스 사용


🔍 추상 클래스와 인터페이스의 차이점

추상 클래스인터페이스
사용 키워드abstractinterface
사용 가능 변수제한 없음static final (상수)
사용 가능 접근 제어자제한 없음public
사용 가능 메소드제한없음추상 메소드, 디폴트 메소드
, 정적 메소드, private method
상속 키워드extendsimplements
다중 상속 가능 여부불가능가능

✅ 공통점


추상 메소드를 가지고 있어야 한다.
인스턴스화 할 수 없다.



📝 인터페이스 vs 추상클래스 사용처

📌 인터페이스

  • 인터페이스는 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하는 것에 초점
  • 다중 구현이 된다는 점을 이용해, 내부 멤버가 없는 빈 껍데기 인터페이스를 선언하여 마커 인터페이스 로서 이용 가능
  • 보통 xxxable 이런 형식으로 인터페이스 네이밍 규칙을 따름

자유로운 타입 묶음

인터페이스 다형성 이용 설계

마커 인터페이스

📌 추상클래스

  • 같은 추상화인 인터페이스와 다른점은, 추상클래스는 클래스간의 연관 관계를 구축하는 것에 초점을 둔다.
  • 추상클래스는 추상 메소드 외에 일반클래스와 같이 일반적인 필드, 메서드, 생성자를 가질수 있다. 따라서, 추상클래스는 추상화(추상 메서드)를 하면서 중복되는 클래스 멤버들을 통합 및 확장을 할 수 있다.

중복 멤버 통합

추상클래스의 다형성 이용 설계

명확한 계층 구조 추상화

참고 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-vs-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0#%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4_%EC%A0%95%EB%A6%AC

📝 인터페이스 + 추상클래스 조합

0개의 댓글