문제점
- Animal 클래스를 생성할 필요가 없다.
- Animal 클래스를 상속받는 곳에서 sound() 메서드를 오버라이딩 하지 않을 가능성이 있다.
⇒ 추상 클래스 도입
추상 클래스
추상적인 개념을 제공하는 클래스로, 인스턴스가 존재하지 않는다.
기존 클래스와 완전히 같지만, new AbstractAnimal()와 같이 직접 인스턴스를 생성하지는 못한다.
abstract class AbstractAnimal {...}
추상 메서드
추상적인 개념을 제공하는 메서드로 실체가 존재하지 않는다.
자식 클래스가 반드시 오버라이딩 해야 한다.
public abstract void sound();
-추상 메서드가 하나라도 있는 클래스는 추상 클래스로 선언해야 한다.(그렇지 않으면 컴파일 오류 발생)
추상 메서드는 메시지 바디가 없다. 따라서 작동하지 않는 메서드를 가진 불완전한 클래스로 볼 수 있다. 그래서 직접 생성하지 못하도록 추상 클래스로 선언해야 한다.
-추상 메서드는 자식 클래스가 오버라이딩 하지 않으면 자식도 추상 클래스가 되어야 한다. (그렇지 않으면 컴파일 오류 발생)
자식 클래스가 해당 메서드를 반드시 오버라이딩 해야 한다.
만약 추상 클래스의 모든 메서드가 추상 메서드라면 순수 추상 클래스라 한다.
부모의 모든 메서드를 구현해야만 한다.
⇒ 이와 같은 의미인 인터페이스가 도입
인터페이스
순수 추상 클래스를 더 편리하게 사용할 수 있는 인터페이스라는 기능을 사용한다.
implements 키워드 사용
public interface InterfaceAnimal {
(public static final) int MY_PI = 3.14 // 인터페이스에서 멤버 변수 = 상수
(public abstract) void sound(); // public abstract 생략 가능
(public abstract) void move();
}
순수 추상 클래스의 특징
-인스턴스를 생성할 수 없다.
-상속시 모든 메서드를 오버라이딩 해야 한다.
-주로 다형성을 위해 사용한다.
인터페이스에서 더해진 편의 기능
-인터페이스의 메서드는 모두 public, abstract이다. (생략이 권장된다)
-인터페이스는 다중 구현(다중 상속)을 지원한다.
인터페이스의 다중 구현
상속의 경우, 만약에 자식이 여러 부모를 상속 받는 다면
부모들이 같은 이름의 메서드를 가질 때 자식이 어떤 메서드를 호출해야 할지 모르는 문제가 있다.
그러나 인터페이스는 모두 추상 메서드로 이루어져있기 때문에
부모 클래스에 같은 이름의 메서드가 여러개 있어도 어처피 오버라이딩된 자식의 메서드가 호출되어 문제가 발생하지 않는다.
⇒ 다중 구현을 허용한다.
인터페이스를 구현하고 추상클래스도 상속 받을 때
public class Bird extends AbstractAnimal implements Fly, Swim {
상속은 하나만 할 수 있고 인터페이스는 다중 구현 할 수 있기 때문에 함께 쓸 경우 extends가 먼저 나와야 한다.
참고) 김영한 - 실전 자바
'BACK > JAVA' 카테고리의 다른 글
[JAVA] 자바 메모리 구조와 static (0) | 2024.05.16 |
---|---|
[JAVA] 다형성과 설계 (0) | 2024.01.30 |
[JAVA] 다형성(다형적 참조, 메서드 오버라이딩) (1) | 2024.01.30 |
[JAVA] 상속과 오버라이딩, super (0) | 2024.01.30 |
[JAVA] Final 키워드 (1) | 2024.01.30 |