자바

JAVA 자바 인터페이스 강제 타입 변환 Casting 과 객체 타입 확인 instancof

알통몬_ 2017. 3. 13. 10:17
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

강제 타입 변환 Casting

 구현 객체가 인터페이스 타입으로 자동 타입 변환되면 인터페이스에 생성된 메서드만 사용가능하다는 제약 사항이 생깁니다. 예를 들어서 인터페이스에는 세 개의 메서드가 선언되어 있고, 클래스에는 다섯 개의 메서드가 선언되어 있다고 할 때 인터페이스로 호출가능한 메서드는 세 개뿐입니다.


경우에 따라 구현 클래스에 선언된 필드와 메서드를 사용해야 하는 경우도 있을 수 있겠죠?

강제 타입 변환을 해서 다시 구현 클래스 타입으로 변환한 다음, 구현 클래스의 필드와 메서드를 사용할 수 있습니다.

구현클래스 변수 = (구현클래스)인터페이스변수;  <= 강제 타입 변환


예제)

인터페이스

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();

}

 

}

반응형