| 정의 | 구현 |
---|
추상클래스 | abstract | extends |
인터페이스 | interface | implements |
* 인터페이스가 인터페이스를 상속
받을 경우 extends를 사용
-
다중 상속
Java와 같은 언어에서는 다중 상속을 지원하지 않습니다. 다중 상속은 하나의 클래스가 여러 부모 클래스로부터 상속되는 것을 의미합니다. 하지만 다중 상속은 복잡성을 증가시키고 충돌 가능성이 있는 메서드 및 속성을 갖게 되는 문제를 야기할 수 있습니다. 인터페이스는 이러한 문제를 해결하기 위해 다중 상속을 지원하는 방법을 제공합니다. 클래스는 여러 인터페이스를 구현할 수 있으며, 이를 통해 다양한 기능을 포함한 객체를 만들 수 있습니다.
-
다형성 강화
추상화는 다형성의 핵심 개념 중 하나입니다. 추상 클래스와 인터페이스는 다형성을 지원하여 하위 클래스 또는 구현 클래스가 다양한 방식으로 상호작용할 수 있도록 합니다. 이로써 유연하고 확장 가능한 시스템을 구축할 수 있습니다.
-
강제성을 부여
인터페이스는 구현해야 하는 메서드를 선언하고, 이를 구현한 클래스에서 반드시 구현해야 합니다.(추상클래스의 추상메서드 역시 동일) 이는 표준화된 메서드와 동작을 보장하고, 오류를 줄이며 안정성을 높입니다.
추상 클래스
💡 자신의 기능들을 하위 클래스로 확장 시키는 느낌
- 추상클래스는 하위 클래스들의 공통점들을 모아 추상화하여 만든 클래스
- 추상클래스는 다중 상속이 불가능하여 단일 상속만 허용한다.
- 추상클래스는 추상 메소드 외에 일반클래스와 같이 일반적인 필드, 메서드, 생성자를 가질수 있다.
- 이러한 특징으로, 추상클래스는 추상화(추상 메서드)를 하면서 중복되는 클래스 멤버들을 통합 및 확장을 할 수 있다.
- 같은 추상화인 인터페이스와 다른점은, 추상클래스는 클래스간의 연관 관계를 구축하는 것에 초점을 둔다.
when
📌 명확한 계층 구조가 필요할 때
- 공통 코드를 공유 & 구체적인 구현 공유
: 공통의 멤버 변수나 메서드를 가질 경우, 이를 상속 받는 하위 클래스에서 확장 또는 재사용할 수 있습니다.
- non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메소드가 필요한 경우)
- 멤버에 public 이외의 접근자(protected, private) 선언이 필요한 경우
- 하위 클래스가 오버라이드하여 재정의하는 기능들을 공유하기 위한 상속 개념을 사용할 때
-추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로, 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능들을 구현해야할 경우 사용한다.
인터페이스
💡 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현하는 느낌
- 내부의 모든 메서드는 public abstract 로 정의 (default 메소드 제외)
- 내부의 모든 필드는 public static final 상수
- 클래스에 다중 구현 지원.
- 인터페이스 끼리는 다중 상속 지원.
- 인터페이스에도 static, default, private 제어자를 붙여 클래스 같이 구체적인 메서드를 가질 수 있음.
- 따라서 하위 멤버의 중복 메서드 통합을 어느정도 할수는 있겠지만, 필드는 상수이기 때문에 중복 필드 통합은 불가능
- 인터페이스는 부모 자식 관계인 상속에 얽매이지 않고, 공통 기능이 필요할 때마다 추상 메서드를 정의해놓고 구현(implement)하는 식으로 추상클래스보다 자유롭게 붙였다 땟다 사용
- 인터페이스는 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용하는 것에 초점
- 다중 구현이 된다는 점을 이용해, 내부 멤버가 없는 빈 껍데기 인터페이스를 선언하여 마커 인터페이스 로서 이용 가능
- 보통 xxxable 이런 형식으로 인터페이스 네이밍 규칙을 따름
when
- 다중 상속이 필요한 경우
- 공통 기능을 정의하고 강제하고 싶을 때
- 클래스간의 관계를 느슨하게 유지하고 싶을 때
- 다양한 클래스에 동일한 동작을 부여하고자 할 때
- 어플리케이션의 기능을 정의해야 하지만 그 구현 방식이나 대상에 대해 추상화 할 때
- 서로 관련성이 없는 클래스들을 묶어 주고 싶을때 (형제 관계)
- 다중 상속(구현)을 통한 추상화 설계를 해야할때
- 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지는 신경쓰지 않는 경우
- 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용
요약
- | 추상 클래스 | 인터페이스 |
---|
사용 키워드 | abstract | interface |
사용 가능 변수 | 제한 없음 | static final (상수) |
사용 가능 접근 제어자 | 제한 없음 (public, private, protected, default) | public |
사용 가능 메소드 | 제한 없음 | abstract method, default method, static method, private method |
상속 키워드 | extends | implements |
다중 상속 가능 여부 | 불가능 | 가능 (클래스에 다중 구현, 인터페이스 끼리 다중 상속) |
공통점
- 추상 메소드를 가지고 있어야 한다.
- 인스턴스화 할 수 없다 (new 생성자 사용 X)
- 인터페이스 혹은 추상 클래스를 상속받아 구현한 구현체의 인스턴스를 사용해야 한다.
- 인터페이스와 추상클래스를 구현, 상속한 클래스는 추상 메소드를 반드시 구현하여야 한다.
출처: https://inpa.tistory.com/entry/JAVA-☕-인터페이스-vs-추상클래스-차이점-완벽-이해하기 [Inpa Dev 👨💻:티스토리]|