언어/java

[Java] 8. 인터페이스 (3) - 8~10

젼젼39 2025. 5. 26. 00:03

8.8 다중 인터페이스 구현

    - 구현 객체여러 개의 인터페이스를 implements 할 수 있음
        -> 각각의 인터페이스를 통해 구현 객체를 사용할 수 있음
            - 모든 인터페이스가 가진 추상 메소드를 재정의해야 함

public class 구현클래스명 implements 인터페이스A, 인터페이스B {
    //모든 추상 메소드 재정의
}

    - 두 인터페이스를 구현한 객체는 각각의 인터페이스 타입의 변수에 각각 대입될 수 있음

    - 구현 객체가 어떤 인터페이스 변수에 대입되느냐에 따라 변수를 통해 호출할 수 있는 추상 메소드가 결정됨

인터페이스A 변수 = new 구현클래스명();
인터페이스B 변수 = new 구현클래스명();

     - 예시 : RemoteControl 인터페이스와 Searchable 인터페이스를 모두 구현한 SmartTelevision 클래스 구현

public interface RemoteControl {
    //추상 메소드
    void turnOn();
    void turnOff();
}
public interface Searchable {
    //추상 메소드
    void search(String url);
}
public class SmartTelevision implements RemoteControl, Searchable {
    //turnOn() 추상 메소드 오버라이딩
    @Override
    public void turnOn() {
        System.out.println("TV를 켭니다.");
    }
    
    //turnOff() 추상 메소드 오버라이딩
    @Override
    public void turnOff() {
        System.out.println("TV를 끕니다.");
    }
    
    //search() 추상 메소드 오버라이딩
    @Override
    public void search(String url) {
        System.out.println(url + "을 검색합니다.");
    }
}
public class MultiInterfaceImplExample {
    public static void main(String[] args) {
    
        //RemoteControl 인터페이스 변수 선언 및 구현 객체 대입
        RemoteControl rc = new SmartTelevision();
        
        //rc로는 RemoteControl 인터페이스에 선언된 추상 메소드만 호출 가능!
        rc.turnOn();
        rc.turnOff();
        
        //Searchable 인터페이스 변수 선언 및 구현 객체 대입
        Searchable searchable = new SmartTelevision();
        
        //searchable로는 Searchable 인터페이스에 선언된 추상 메소드만 호출 가능
        searchable.search("https://www.youtube.com");
    }
}

 

8.9 인터페이스 상속

    - 인터페이스도 다른 인터페이스를 상속할 수 있음

    - 클래스와 달리 다중 상속을 허용함; extends 키워드 뒤에 상속할 인터페이스들을 나열하면 됨

public interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2 {...}

    - 자식 인터페이스의 구현 클래스 : (자식 인터페이스의 메소드 + 부모 인터페이스의 모든 추상 메소드) 를 재정의해야 함

    - 구현 객체는 자식 및 부모 인터페이스 변수에 대입될 수 있음

자식인터페이스 변수 = new 구현클래스(...);
부모인터페이스1 변수 = new 구현클래스(...);
부모인터페이스2 변수 = new 구현클래스(...);

    - 구현 객체가 자식 인터페이스 변수에 대입됨 --> 자식 & 부모 인터페이스의 추상 메소드를 모두 호출 가능

    - 구현 객체가 부모 인터페이스 변수에 대입됨 --> 부모 인터페이스에 선언된 추상 메소드만 호출 가능

 

8.10 타입 변환

    - 인터페이스의 타입 변환 : 인터페이스구현 클래스 간에 발생

    - 인터페이스 변수에 구현 객체를 대입 -> 구현 객체는 인터페이스 타입으로 자동 타입 변환
    - 자동 타입 변환된 뒤, 캐스팅 기호를 사용해 인터페이스 타입을 구현 클래스 타입으로 강제 타입 변환

(1) 자동 타입 변환

인터페이스 변수 = 구현객체;

//구현객체가 인터페이스 타입으로 자동 타입 변환됨

    - 부모 클래스가 인터페이스를 구현하고 있다면, 자식 클래스도 인터페이스 타입으로 자동 타입 변환될 수 있음

* 인터페이스 A를 구현한 B, C 클래스가 있고, 각각을 상속한 D, E 클래스가 있다면,
      B, C, D, E로부터 생성된 객체는 모두 인터페이스 A로 자동 타입 변환될 수 있음
      (모두 인터페이스 A를 직/간접적으로 구현하고 있기 때문)

A a;
a = new B(); //A 타입으로 자동 타입 변환
a = new C();
a = new D();
a = new E();

(2) 강제 타입 변환

    : 캐스팅 기호를 사용해 인터페이스 타입을 구현 클래스 타입으로 변환시키는 것

구현클래스 변수 = (구현클래스) 인터페이스변수;

//인터페이스변수가 구현클래스 타입으로 강제 타입 변환됨

    - 구현 객체가 인터페이스 타입으로 강제 타입 변환되면 인터페이스에 선언된 메소드만 사용 가능함

    - 자동 타입 변환 뒤에 기존 메소드들을 호출하려면 캐스팅 기호를 사용해 원래 타입으로 강제 타입변환해야 함

RemoteControl rc = new Television();
rc.turnOn();
rc.turnOff();
rc.setVolume(5);
Television tv = (Television) rc; //강제 타입 변환!
tv.turnOn();
tv.turnOff();
tv.setVolume(5);
tv.setTime();
tv.record();

    - 예: Vehicle과 Bus 예시

interface Vehicle {
    void run();
}
class Bus implements Vehicle {
    void run() {...}
    void checkFare() {...}
}
public static void main(String[] args) {
    //인터페이스 변수 선언과 구현 객체 대입
    Vehicle vehicle = new Bus();
    
    //인터페이스를 통해서 호출
    vehicle.run();
    //vehicle.checkFare(); 이건 불가능!
    
    //강제 타입 변환 후 호출
    Bus bus = (Bus) vehicle;
    bus.run();
    bus.checkFare();
}