인터페이스를 이용한 다중 상속

·2025년 5월 10일

Power Java

목록 보기
34/75

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이 되어서 상수가 된다. (값을 명시해주어야 함)

 

0개의 댓글