-
인터페이스 vs 추상클래스Java 2023. 3. 18. 15:57
- Abstract Class
: 상속을 통해 자손 클래스에서 완성하도록 유도하는 클래스 (설계도)
- 상속을 위한 클래스 이기 때문에 따로 객체 생성이 불가함
- 하위 클래스들의 공통점을 모아 추상화한 클래스
- 다중 상속 불가! 단일 상속만 가능하다.
- 자신의 기능들을 하위 클래스로 확장
- extends
!! 중복 멤버 통합 !!
- Interface
: 다중 구현 및 다중 상속이 가능하다.
- 구체적인 메서드를 가질수 있음.
- 상속에 얽매이지 않고 공통 기능이 필요할때 마다 추상 메서드를 정의하여
- 이를 구현하여 자유롭게 사용가능함.
- 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장
- implements
interface Animal { public abstract void cry(); } class Cat implements Animal { public void cry() { System.out.println("냐옹냐옹!"); } } class Dog implements Animal { public void cry() { System.out.println("멍멍!"); } } public class Polymorphism03 { public static void main(String[] args) { Cat c = new Cat(); Dog d = new Dog(); c.cry(); d.cry(); } }
인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현
꼭 필요한 기능만을 추상 클래스로 구현!
나머지는 인터페이스로 -> 인터페이스 분리 원칙
ex) 새 라는 추상클래스에서 날기()와 울기()라는 메서드가 있다면,
펭귄 이라는 클래스에 인터페이스 분리원칙을 적용하기 위해 날기() 를 인터페이스로, 바꿀수 있음.
울기()는 모든 새의 공통된 메서드이고 날기()의 경우는 펭귄에게는 적용되지 않기 때문!
인터페이스를 사용할 때 ->
- 어플리케이션의 기능을 정의해야 하지만 그 구현 방식이나 대상에 대해 추상화 할 때
- 서로 관련성이 없는 클래스들을 묶어 주고 싶을때 (형제 관계)
- 다중 상속(구현)을 통한 추상화 설계를 해야할때
- 특정 데이터 타입의 행동을 명시하고 싶은데, 어디서 그 행동이 구현되는지는 신경쓰지 않는 경우
- 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용
추상 클래스를 사용할 때 ->
- 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많아 중복 멤버 통합을 할때
- 멤버에 public 이외의 접근자(protected, private) 선언이 필요한 경우
- non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메소드가 필요한 경우)
- 요구사항과 함께 구현 세부 정보의 일부 기능만 지정했을 때
- 하위 클래스가 오버라이드하여 재정의하는 기능들을 공유하기 위한 상속 개념을 사용할 때
- 추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로, 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능들을 구현해야할 경우 사용한다.