자바의 정석 - 참조변수의 형변환 (어렵)

Yohan·2024년 1월 21일
0

참조변수의 형변환

  • 사용할 수 있는 멤버의 개수를 조절하는 것
  • 조상 자손 관계의 참조변수는 서로 형변환 가능
FireEngine f = new FireEngine();

Car c = (Car)f; // 조상인 Car 타입으로 형변환 (생략가능)
FireEngine f2 = (FireEngine)c; // 자손인 FireEngine 타입으로 형변환 (생략불가)
Ambulance a = (Ambulance)f; // 상속관계가 아닌 클래스 간의 형변환 불가
  • Car의 멤버변수 : 4 , FireEngine의 멤버변수 : 4+1(본인) = 5
    -> 형변환을 통해 멤버변수가 4, 5로 변환이 가능한 것

  • Car는 조상, FireEngine은 자손
  • Car에는 4개의 멤버변수, FireEngine에는 1개의 멤버변수 (water 메서드)
class Ex {
	public static void main(String args[]) {
    	Car car = null;
        FireEngine fe = new FireEngine();
        FireEngine fe2 = null;
        
        fe.water();
        car = fe; // car = (car)fe; 에서 형변환 생략됨
        		  // 5개 -> 4개 (멤버변수 줄어드는 것은 안전)
        car.water(); // 에러, car 타입에는 water 메서드 없음
        fe2 = (FireEngine)car; // 조상타입 -> 자손타입 (4개 -> 5개) - 인스턴스가 FireEngine이라 5개로 늘어나도 멤버변수를 벗어나지 않않으므로 형변환이 가능 (에러 안뜸)
        fe2.water();
    }
}

class Ex { 
	public static void main(String args[]) {
    	Car car = null;
        FireEngine fe = new FireEngine(); // 실제 객체가 무엇인지 중요
        
        FireEngine fe2 = (FireEngine)car; // 조상 -> 자손으로 형변환
       								      // fe2 참조변수가 가리키는 실제객체는 FireEngine이므로 5개 멤버 사용가능
        Car car2 = (Car)fe2; // 자손 -> 조상으로 형변환
        					 // car2 참조변수가 가리키는 실제객체는 Car이므로 4개 멤버 사용가능
        car2.drive(); // NullPointerException 발생 (car가 null이라)
        
    }
}
  • 조상 -> 자손으로 형변환 할 때는 실제 객체가 무엇인지 중요
    • 에러가 날 수도 있기 때문에
class Ex { 
	public static void main(String args[]) {
    	Car c = new Car(); // 실제 객체 (멤버 4개)
        FireEngine fe = (FireEngine)c; // 형변환 실행 에러 (car 인스턴스의 멤버개수인 4개 -> 5개로 넘어가기 때문에!)
        fe.water(); // 컴파일은 ok
    }
  • 위 예시에서 Car 인스턴스를 생성했기 때문에 Car의 멤버 변수 (4개)를 벗어나면 안된다. 실제 인스턴스의 멤버 개수 내에서만 형변환이 가능!
    내부적으로 형변환은 되지만 실제 실행하였을 때는 에러가 발생하기 때문에 하면 안된다.

형변환도 중요하지만 참조변수가 가리키는 실제 인스턴스(객체)가 무엇인지 확인하여 그 인스턴스의 멤버변수를 벗어나지 않는 선에서 형변환이 이루어져야한다!

profile
백엔드 개발자

0개의 댓글