자바에서는 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등의 문제가 발생할 수 있어 다중 상속을 지원하지 않는다.
class Animal {
public void cry() {
System.out.println("짖기!");
}
}
class Cat extends Animal {
public void cry() {
System.out.println("냐옹냐옹!");
}
}
class Dog extends Animal {
public void cry() {
System.out.println("멍멍!");
}
}
class MyPet extends Cat, Dog {}
public class Polymorphism {
public static void main(String[] args) {
MyPet p = new MyPet();
p.cry(); // --- 문제
}
}
위의 코드에서 MyPet은 Cat과 Dog를 다중 상속받고 있다.
MyPet 객체를 생성하고 cry() 메서드를 호출하면, 이 메서드가 Cat 클래스에서 상속받은 cry() 메서드인지, Dog 클래스에서 상속받은 cry() 메서드인지 구분할 수 없는 모호성이 발생한다.
이를 해결하기 위해 인터페이스를 통해 다중 상속을 지원한다.
인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하는 일종의 추상 클래스이다.
인터페이스는 오로지 추상 메서드와 상수만 포함할 수 있다.
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메소드이름(매개변수);
}
모든 필드는 public static final
,
모든 메서드는 public abstract
이어야 한다.
단, 생략 가능하다.
추상클래스와 마찬가지로 직접 인스턴스를 생성할 수 없다.
따라서 인터페이스의 추상메서드를 구현해 줄 클래스가 필요하다.
class 클래스이름 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();// "멍멍!" 출력
}
}