
클래스 상속과 인터페이스 구현을 함께 사용하는 예를 알아보자.

AbstractAnimal은 추상 클래스이다.sound() : 동물의 소리를 내기 위한 sound() 추상 메서드를 제공한다.move() : 동물의 이동을 표현하기 위한 메서드이다. 이 메서드는 추상 메서드가 아니다. 상속을 목적으로 사용된다.Fly는 인터페이스이다. 나는 동물은 이 인터페이스를 구현할 수 있다.Bird, Chicken은 날 수 있는 동물이다. Fly() 메서드를 구현해야 한다.package poly.ex6;
public abstract class AbstractAnimal {
public abstract void sound();
public void move() {
System.out.println("동물이 이동합니다.");
}
}
package poly.ex6;
public interface Fly {
void fly();
}
package poly.ex6;
public class Dog extends AbstractAnimal {
@Override
public void sound() {
System.out.println("멍멍");
}
}
Dog는 AbstractAnimal만 상속 받는다.
package poly.ex6;
public class Bird extends AbstractAnimal implements Fly {
@Override
public void sound() {
System.out.println("짹짹");
}
@Override
public void fly() {
System.out.println("새 날기");
}
}
Bird는 AbstractAnimal 클래스를 상속하고 Fly 인터페이스를 구현한다.
public class Bird extends AbstractAnimal implements Fly, Swim { ... }
extends를 통한 상속은 하나만 할 수 있고 implements를 통한 인터페이스는 다중 구현 할 수 있기 때문에 둘이 함께 나온 경우 extends가 먼저 나와야 한다.
package poly.ex6;
public class Chicken extends AbstractAnimal implements Fly {
@Override
public void sound() {
System.out.println("꼬끼오");
}
@Override
public void fly() {
System.out.println("닭 날기");
}
}
package poly.ex6;
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);
flyAnimal(bird);
flyAnimal(chicken);
}
// AbstractAnimal 사용 가능
private static void soundAnimal(AbstractAnimal animal) {
System.out.println("동물 소리 테스트 시작");
animal.sound();
System.out.println("동물 소리 테스트 종료");
}
// Fly 인터페이스가 있으면 사용 가능
private static void flyAnimal(Fly fly) {
System.out.println("날기 테스트 시작");
fly.fly();
System.out.println("날기 테스트 종료");
}
}


soundAnimal(AbstractAnimal animal)
AbstractAnimal을 상속한 Dog, Bird, Chicken을 전달해서 실행할 수 있다.
soundAnimal(bird)를 호출한다고 가정하자.animal.sound()를 호출하면 참조 대상인 x001 Bird 인스턴스를 찾는다.animal 변수는 AbstractAnimal 타입이다. 따라서 AbstractAnimal.sound()를 찾는다. 해당 메서드는 Bird.sound()에 오버라이딩 되어 있다.Bird.sound()가 호출된다.
flyAnimal(Fly fly)
Fly 인터페이스를 구현한 Bird, Chicken을 전달해서 실행할 수 있다.
fly(bird)를 호출한다고 가정하자.fly.fly()를 호출하면 참조 대상인 x001 Bird 인스턴스를 찾는다.fly 변수는 Fly 타입이다. 따라서 Fly.fly()를 찾는다. 해당 메서드는 Bird.fly()에 오버라이딩 되어 있다.Bird.fly()가 호출된다.출처 : 김영한의 실전 자바 - 기본편
https://www.inflearn.com/course/김영한의-실전-자바-기본편/dashboard