7.3 인터페이스를 이용한 다중 상속
public interface RemoteControl {
public void turnOn();
public void turnOff();
}
public interface RemoteControl {
public void turnOn();
public void turnOff();
public void volumeUp();
public void volumeDown();
}
==> 다른 프로그래머들이 사용하고 있던 인터페이스를 변경시키면, 이 인터페이스를 구현하였던 모든 클래스가 동작하지 않게 된다.
-해결방법
:상속을 받아서 확장시키면 된다.
Ex)
public interface AdvancedRemoteControl extends RemoteControl {
public void volumeUp();
public void volumeDown();
}
다중 상속
: 하나의 클래스가 여러 개의 부모 클래스를 가지는 것
ex) 하늘을 나는 자동차 (부모: 비행기, 자동차)
다이아몬드 문제
A : myMethod()
B, C: myMethod() 오버라이드
B, C가 A로부터 상속을 받고,
D가 B와 C에서 상속을 받는 경우
D를 통하여 myMethod()를 호출하게 되면,
어떤 메소드가 호출되는가에 대한 애매함 때문에 자바에서는 "다중 상속"을 허용하지 않는다.
=> 하지만, 인터페이스를 이용하여 다중 상속과 비슷한 효과를 낼 수 있다.
방법 1)
interface Drivable { void drive(); }
interface Flyable { void fly(); }
public class FlyingCar1 implements Drivable, Flyable {
public void drive() { System.out.println("I'm driving"); }
public void fly() { System.out.println("I'm flying"); }
public static void main(String args[]) {
FlyingCar1 obj = new FlyingCar1();
obj.drive();
obj.fly();
}
}
출력
I'm driving
I'm flying
=> 여러 개의 인터페이스를 동시에 구현
방법 2)
interface Flyable { void fly(); }
class Car {
int speed;
void setSpeed(int speed) { this.speed = speed; }
}
public class FlyingCar2 extends Car implements Flyable {
public void fly() { System.out.println("I'm flying!"); }
public static void main(String args[]) {
FlyingCar2 obj = new FlyingCar2();
obj.setSpeed(300);
obj.fly();
}
}
출력
I'm flying
=> 하나의 클래스를 상속받고, 또 하나의 인터페이스를 구현하는 것.
-인터페이스에서는 상수를 정의할 수 있다.
인터페이스에서 정의된 변수는 자동적으로
public static final이 되어서 상수가 된다. (값을 명시해주어야 함)