인터페이스(Interface)와 추상 클래스(Abstract Class)

jiji·2023년 11월 6일
0

JAVA

목록 보기
8/9
정의구현
추상클래스abstractextends
인터페이스interfaceimplements

* 인터페이스가 인터페이스를 상속 받을 경우 extends를 사용

  1. 다중 상속
    Java와 같은 언어에서는 다중 상속을 지원하지 않습니다. 다중 상속은 하나의 클래스가 여러 부모 클래스로부터 상속되는 것을 의미합니다. 하지만 다중 상속은 복잡성을 증가시키고 충돌 가능성이 있는 메서드 및 속성을 갖게 되는 문제를 야기할 수 있습니다. 인터페이스는 이러한 문제를 해결하기 위해 다중 상속을 지원하는 방법을 제공합니다. 클래스는 여러 인터페이스를 구현할 수 있으며, 이를 통해 다양한 기능을 포함한 객체를 만들 수 있습니다.

  2. 다형성 강화
    추상화는 다형성의 핵심 개념 중 하나입니다. 추상 클래스와 인터페이스는 다형성을 지원하여 하위 클래스 또는 구현 클래스가 다양한 방식으로 상호작용할 수 있도록 합니다. 이로써 유연하고 확장 가능한 시스템을 구축할 수 있습니다.

  3. 강제성을 부여
    인터페이스는 구현해야 하는 메서드를 선언하고, 이를 구현한 클래스에서 반드시 구현해야 합니다.(추상클래스의 추상메서드 역시 동일) 이는 표준화된 메서드와 동작을 보장하고, 오류를 줄이며 안정성을 높입니다.


추상 클래스

💡 자신의 기능들을 하위 클래스로 확장 시키는 느낌

  • 추상클래스는 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스
  • 추상클래스는 다중 상속이 불가능하여 단일 상속만 허용한다.
  • 추상클래스는 추상 메소드 외에 일반클래스와 같이 일반적인 필드, 메서드, 생성자를 가질수 있다.
    • 이러한 특징으로, 추상클래스는 추상화(추상 메서드)를 하면서 중복되는 클래스 멤버들을 통합 및 확장을 할 수 있다.
  • 같은 추상화인 인터페이스와 다른점은, 추상클래스는 클래스간의 연관 관계를 구축하는 것에 초점을 둔다.

when

📌 명확한 계층 구조가 필요할 때

  • 공통 코드를 공유 & 구체적인 구현 공유
    : 공통의 멤버 변수나 메서드를 가질 경우, 이를 상속 받는 하위 클래스에서 확장 또는 재사용할 수 있습니다.
  • non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메소드가 필요한 경우)
  • 멤버에 public 이외의 접근자(protected, private) 선언이 필요한 경우
  • 하위 클래스가 오버라이드하여 재정의하는 기능들을 공유하기 위한 상속 개념을 사용할 때
    -추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로, 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능들을 구현해야할 경우 사용한다.

인터페이스

💡 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현하는 느낌

  • 내부의 모든 메서드는 public abstract 로 정의 (default 메소드 제외)
  • 내부의 모든 필드는 public static final 상수
  • 클래스에 다중 구현 지원.
  • 인터페이스 끼리는 다중 상속 지원.
  • 인터페이스에도 static, default, private 제어자를 붙여 클래스 같이 구체적인 메서드를 가질 수 있음.
    • 따라서 하위 멤버의 중복 메서드 통합을 어느정도 할수는 있겠지만, 필드는 상수이기 때문에 중복 필드 통합은 불가능
  • 인터페이스는 부모 자식 관계인 상속에 얽매이지 않고, 공통 기능이 필요할 때마다 추상 메서드를 정의해놓고 구현(implement)하는 식으로 추상클래스보다 자유롭게 붙였다 땟다 사용
  • 인터페이스는 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하는 것에 초점
  • 다중 구현이 된다는 점을 이용해, 내부 멤버가 없는 빈 껍데기 인터페이스를 선언하여 마커 인터페이스 로서 이용 가능
  • 보통 xxxable 이런 형식으로 인터페이스 네이밍 규칙을 따름

when

  • 다중 상속이 필요한 경우
  • 공통 기능을 정의하고 강제하고 싶을 때
  • 클래스간의 관계를 느슨하게 유지하고 싶을 때
  • 다양한 클래스에 동일한 동작을 부여하고자 할 때
  • 어플리케이션의 기능을 정의해야 하지만 그 구현 방식이나 대상에 대해 추상화 할 때
  • 서로 관련성이 없는 클래스들을 묶어 주고 싶을때 (형제 관계)
  • 다중 상속(구현)을 통한 추상화 설계를 해야할때
  • 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지는 신경쓰지 않는 경우
  • 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용

요약

-추상 클래스인터페이스
사용 키워드abstractinterface
사용 가능 변수제한 없음static final (상수)
사용 가능 접근 제어자제한 없음 (public, private, protected, default)public
사용 가능 메소드제한 없음abstract method, default method, static method, private method
상속 키워드extendsimplements
다중 상속 가능 여부불가능가능 (클래스에 다중 구현, 인터페이스 끼리 다중 상속)

공통점

  1. 추상 메소드를 가지고 있어야 한다.
  2. 인스턴스화 할 수 없다 (new 생성자 사용 X)
  3. 인터페이스 혹은 추상 클래스를 상속받아 구현한 구현체의 인스턴스를 사용해야 한다.
  4. 인터페이스와 추상클래스를 구현, 상속한 클래스는 추상 메소드를 반드시 구현하여야 한다.

출처: https://inpa.tistory.com/entry/JAVA-☕-인터페이스-vs-추상클래스-차이점-완벽-이해하기 [Inpa Dev 👨‍💻:티스토리]|

0개의 댓글

관련 채용 정보