참조변수의 형변환 가능여부 확인에 사용. 가능하면 true 반환
1. instanceof 연산자로 확인(형변환 해도 되는지) -> 2. 형변환
형변환 전에 반드시 instanceof로 확인해야 함Ex) c가 FireEngine의 자손인가를 확인하는 경우 void dowork(Car c) { // doWork(new Car()); / doWork(new FireEngine()); / doWork(new Ambulanced)); 3문장이 모두 가능 / doWork(new FireEngine());은 Car c = new FireEngine(); doWork(c);와 동일 if(c instanceof FireEngine) { // 1. 형변환이 가능한지 확인 FireEngine fe = (FireEngine)c; // 2. 형변환 fe.water(); ... }
- 형변환을 하는 이유는 인스턴스의 원래 기능을 모두 사용하려고 Car타입의 리모코인 c로는 water()를 호출할 수 없으니까, 리몬콘을 FireEngine타입으로 바꿔서 water()를 호출
FireEngine fe = new FireEngine(); System.out.println(fe instanceof Object); // true System.out.println(fe instanceof Car); // true System.out.println(fe instanceof FireEngine); // true
- FireEngine -> Car -> Object
- 어떤 타입을 지정했을 때, instanceof 형변환이 가능한지 확인한다.
Object obj = (Object)fe; // OK / Object는 모든 객체의 조상이므로 안 써도 Ok Car c = (Car)fe; // OK
instanceof로 형변환이 가능한지 확인 후 형변환을 해야한다.
instanceof는 조상-자손에 관해서는 true를 반환한다.
Q. 참조변수의 형변환은 왜 하나요?
A. 참조변수(리모콘)을 변경함으로써 사용할 수 있는 멤버의 갯수를 조절하기 위해서
- 형변환을 해서 주소값, 객체의 값은 변경되지 않는다.
- 형변환은 참조변수의 타입만 변경되는 것이다.
Q2. instanceof연산자는 언제 사용하나요?
A. 참조변수를 형변환하기 전에 형변환 가능여부를 확인할 때
참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
- 장점 : 1. 다형적 매개변수 2. 하나의 배열로 여러종류 객체 다루기
- 다형성
1. 조상타입의 참조변수로 자손 객체 다루기(Tv t = new SamrtTv();)
2. 참조변수의 형변환 (리모컨 바꾸기 / 사용가능한 멤버갯수 조절)
3. instanceof연산자(형변환 가능여부 확인)
- Product는 조상 클래스 / Tv,Computer,Audio는 자손 클래스
- Buyer가 물건을 구매했을 때를 계산하기 위해 buy라는 메서드를 추가
- Tv라는 메서드를 추가했으므로 Tv만 들어올 수 있다.
- Computer와 Audio가 들어오기 위해서는 각각의 메서드를 적어야한다. (= 오버로딩)
- 오버로딩 = 메서드이름이 같고, 매개변수 타입이 다른 것
- 그러나, 코드가 중복되고 다수의 데이터가 생길 시 관리하기 힘들어진다.
- 그래서 Tv 타입이 아닌 조상타입의 Product타입을 사용한다.
- 그렇게 되면, Product 메서드 하나로 여러 물건을 구입할 수 있게 된다.
- 다형성에 의해서 조상타입의 참조변수로 자손타입의 객체를 가리킬 수 있게 된다.
- 메서드 하나로 모든 물건을 살 수 있기 때문에 여러 메서드를 만들지 않아도 된다.