김영한의 자바 강의를 듣고 정리하였습니다.
따라서 추상 클래스와 인터페이스를 한 번에 같이 상속할 수 있다. 예제를 통해 이해해 보도록 한다.
public abstract class abAbstractAnimal {
public abstract void sound(); // 추상 메서드 -> 상속하는 자식이 구현해야 함.
public void move() {
System.out.println("동물이 이동합니다.");
}
}
public interface Fly {
void fly(); // 인터페이스는 무조건 추상 메서드 -> 자식이 무조건 구현
}
public class Dog extends abAbstractAnimal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
abAbstractAnimal 클래스를 상속 받았으므로 부모의 추상메서드인 sound 메서드를 무조건 구현해야 함.
public class Bird extends abAbstractAnimal implements Fly {
@Override
public void sound() { // abAbstractAnimal 부모 클래스의 메서드 구현
System.out.println("짹짹");
}
@Override
public void fly() { // Fly 인터페이스의 메서드 구현
System.out.println("새 날기");
}
}
public class SoundFlyMain {
public static void main(String[] args) {
Dog dog = new Dog();
Bird bird = new Bird();
Chicken chicken = new Chicken();
soundAnimal(dog);
soundAnimal(bird);
soundAnimal(chicken);
fly(bird);
fly(chicken);
}
// animal = abAbstractAnimal을 상속 받은 animal 객체들
private static void soundAnimal(abAbstractAnimal animal) {
System.out.println("동물 소리 테스트 시작");
animal.sound();
System.out.println("동물 소리 테스트 종료");
}
// fly = Fly 인터페이스를 구현한 fly 객체들
private static void fly(Fly fly) {
System.out.println("날기 테스트 시작");
fly.fly();
System.out.println("날기 테스트 종료");
}
}
다형성은 다형적 참조, 메서드 오버라이딩 이 두 기능을 통해서 분산되어 있는 타입을 합치고,
런타임 시점에 인스턴스 위치에 있는 오버라이딩 메서드를 실행시켜 주도록 한다.
인터페이스 == 설계도