인스턴스의 다형성
프로그램 소스 코드 변함 없이 구현 객체를 교체했을 때 다양한 프로그램의 실행결과가 나오는 것.
클래스가 A, B가 있다고 가정했을 때, 인터페이스 구현 클래스를 A로 했을 때 문제가 발생하면 B 클래스와 교체한 후 프로그램 재실행 가능
구현 객체가 인터페이스 타입으로 변환되는 것.
인터페이스 구현 클래스를 상속해서 자식 클래스 만들었으면 자식 객체도 인터페이스 타입으로 자동 타입 변환할 수 있음.
즉, Car의 run() 메소드는 수정하지 않아도 다양한 roll() 메소드의 결과값을 얻음.
메소드 호출 시에도 자동 타입 변환 발생
매개 변수를 인터페이스 타입으로 선언하고 호출 시 구현 객체 대입.
매개 변수의 인터페이스화
Driver 클래스의 drive() 메소드의 매개값을 Vehicle 인터페이스로 지정. vehicle이 구현 객체가 되고 구현 객체의 run() 메소드가 실행됨.
인터페이스
Vehicle 선언
구현 클래스, 구현 메소드 재정의
Bus, Taxi
실행 클래스로 매개 변수의 다형성 테스트
driver.drive(bus)
와 driver.drive(taxi)
에서 자동 타입 변환이 일어남.
-> Vehicle vehicle = bus
, Vehicle vehicle = taxi
구현 객체가 인터페이스 타입으로 자동 타입 변환 시 인터페이스에 선언된 메소드만 사용 가능함. 만약 구현 클래스에 선언된 필드와 메소드를 사용 시 강제 타입 변환으로 다시 구현 클래스 타입으로 변환
강제타입변환 전에는 checkFare() 메소드 호출 X
-> Vehicle 인터페이스에 없는 메소드
구현 클래스인 Bus의 checkFare() 메소드 호출을 위해 강제 타입 변환 진행
구현 객체가 인터페이스 타입인지 확인한 후 강제 타입 변환을 진행해야 함.
instanceof
연산자로 매개값이 어떤 객체인지 확인
public void drive(Vehicle vehicle) {
if(vehicle instanceof Bus) {
Bus bus = (Bus) vehicle;
bus.checkFare();
}
인터페이스는 다중 상속이 허용됨.
extend
키워드 뒤에 상속할 인터페이스 나열
하위 인터페이스의 구현 클래스는 하위/상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드가 있어야 함.
하위 인터페이스로 타입 변환 시: 상위/하위 인터페이스에 선언된 모든 메소드 사용 가능
상위 인터페이스로 타입 변환 시: 상위 인터페이스에 선언된 메소드만 사용 가능
extends
키워드 뒤에 상위 인터페이스 나열하여 상속 받음.