[Java] 8. 인터페이스 (3) - 8~10
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();
}