[Java의 정석]Chapter7.객체지향 프로그래밍2(24~25)

Hello_Wendy·2022년 5월 19일
0

자바의 정석

목록 보기
56/61
post-thumbnail

Chapter 7. 객체지향 프로그래밍 2

24. 참조변수의 형변환

  • 기본형 변수처럼 참조변수도 형변환이 가능
  • 단, 서로 상속관계 있는 클래스 사이에서만 가능하기 때문에 (자손타입의 참조변수를 조상타입의 참조변수)로, (조상타입의 참조변수를 자손타입의 참조변수)로의 형변환만
  • 조상의 조상으로도 형변환 가능. 즉, 모든 참조변수는 모든 클래스의 조상인 Object 클래스 타입으로 형변환 가능

class Car {}
class FireEngine extends Car {}
class Ambulance extends Car {}

만일 위와 같이 Car 클래스가 있고, 이를 상속받는 FireEngine, Ambulance 클래스가 있을 때, FireEngine 타입의 참조변수 f는 조상타입인 Car로 형변환 가능. 반대로 Car타입의 참조변수를 자손타입인 FireEngine으로 형변환 하는 것도 가능.
→ 그러나, FireEngine과 Ambulance는 상속관계가 아니므로 형변환이 불가

서로 상속관계에 있는 타입간의 형변환은 양뱡향 자유롭게 수행되지만 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용 불가

FireEngine f = new FireEngine();

Car c = (Car)f; //OK.조상인 Car타입으로 형변환(생략가능)
FireEngine f2 = (FireEngine)c; //OK. 자손인 FireEngine타입으로 형변환(생략불가)
Ambulance a = (Ambulance)f; //에러.상속관계가 아닌 클래스 간의 형변환 불가
  • 기본형의 형변환과 달리 참조형의 형변환은 변수에 저장된 값(주소값)이 변환되는 것이 아님

Car c = (car) f;
//f의 값(객체의 주소)을 c에 저장. 타입을 일치시키기 위해 형변화 필요(생략가능)
f = (FireEngine) c;
//조상타입을 자손타입으로 형변환 하는 경우 생략 불가

▶ 조상타입으로의 형변환을 생략할 수 있는 이유는 조상타입으로 형변환하면 다룰 수 있는 멤버의 개수가 줄어들기 때문에 안전함

25. 참조변수의 형변환 예제

package 자바의정석;

public class Ex7_7 {

	public static void main(String[] args) {
		Car car = null;
		FireEngine fe = new FireEngine(); //FireEngine객체를 생성
		FireEngine fe2 = null;

		fe.water();
		car = fe; // car = (car)fe;에서 형변환 생략함.fe의 값을 car에 저장
		// car.water(); → 컴파일 에러. Car타입의 참조변수로는 water()를 호출할 수 없음
		fe2 = (FireEngine) car; // 자손타입 ← 조상타입. 형변환 생략 불가
		fe2.water();
	}
}

class Car {
	String color;
	int door;

	void drive() { // 운전하는 기능
		System.out.println("drive, Brrrr~");
	}

	void stop() { // 멈추는 기능
		System.out.println("stop!!");
	}
}

class FireEngine extends Car { // 소방차
	void water() { // 물을 뿌리는 기능
		System.out.println("water!!");
	}
}
  • 결과

    water!!
    water!!

profile
안녕 나의 새로운 세상

0개의 댓글