클래스 상속과 인터페이스 구현을 함께 사용하는 예를 알아보자.
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