안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
구현 객체가 인터페이스 타입으로 자동 타입 변환되면 인터페이스에 생성된 메서드만 사용가능하다는 제약 사항이 생깁니다. 예를 들어서 인터페이스에는 세 개의 메서드가 선언되어 있고, 클래스에는 다섯 개의 메서드가 선언되어 있다고 할 때 인터페이스로 호출가능한 메서드는 세 개뿐입니다.
경우에 따라 구현 클래스에 선언된 필드와 메서드를 사용해야 하는 경우도 있을 수 있겠죠?
강제 타입 변환을 해서 다시 구현 클래스 타입으로 변환한 다음, 구현 클래스의 필드와 메서드를 사용할 수 있습니다.
구현클래스 변수 = (구현클래스)인터페이스변수; <= 강제 타입 변환
예제)
인터페이스
public interface Vehicle {
public void run();
}
구현 클래스
public class Bus implements Vehicle {
@Override
public void run() {
System.out.println("버스가 달립니다.");
}
public void checkFare() {
System.out.println("승차요금을 체크합니다.");
}
}
강제 타입 변환
public class VehicleExample {
public static void main(String[] args) {
Vehicle vehicle = new Bus();
vehicle.run();
//vehicle.checkFare(); (x)
Bus bus = (Bus) vehicle; //강제타입변환
bus.run();
bus.checkFare();
}
}
객체 타입 확인 instanceof
강제 타입 변환은 구현 객체가 인터페이스 타입으로 변환되어 있는 상태에서만 가능합니다.
어떤 구현 객체가 변환되어 있는지 알 수 없는 상태에서
무작정 변환을 하면 ClassException이 발생할 수 있습니다.
ex) Vehicle vehicle = new Taxi();
Bus bus = (Bus)vehicle;
위 코드처럼 Taxi 객체가 인터페이스 타입으로 변환되어 있을 때
Bus 타입으로 강제 타입 변환을 하면 구현 클래스의 타입이 다르기 때문에 ClassException이 발생합니다.
인터페이스 타입으로 자동 변환된 매개값을 메서드 내에서
다시 구현 클래스 타입으로 강제 타입 변환해야 한다면
꼭 매개값이 어떤 객체인지 instanceof 연산자로 확인하고 안전하게 강제 타입 변환을 해야합니다.
예제)
public class Driver {
public void drive(Vehicle vehicle) {
if(vehicle instanceof Bus) { // 이런 식으로
Bus bus = (Bus) vehicle;
bus.checkFare();
}
vehicle.run();
}
}
'자바' 카테고리의 다른 글
JAVA 자바 디폴트 메서드와 인터페이스 확장 - 디폴트 메서드의 필요성 (0) | 2017.03.13 |
---|---|
JAVA 자바 인터페이스 상속 (0) | 2017.03.13 |
JAVA 자바 인터페이스 매개 변수의 다형성 (0) | 2017.03.13 |
JAVA 자바 인터페이스 필드의 다형성 // 인터페이스 배열로 구현 객체 관리 (0) | 2017.03.13 |
JAVA 자바 인터페이스: 자동 타입 변환(Promotion) (0) | 2017.03.13 |