Java - 형변환

이정민·2021년 10월 18일
0

참조변수의 형변환

class Car {
   String color;
   int door;
   
   void drive() {
      System.out.println("drive, Brrrr~");
   }
   
   void stop() {
      System.out.println("stop!");
   }
}

class Fireegine extends Car {
   void water() {
      System.out.println("water!!");
   }
}

class Ambulance extends Car {
   void siren() {
      System.out.println("siren~");
   }
}
--------------------------------------

public static void main(String args[]) {
   Car car = null;
   FireEngin fe = new FireEngin();
   FireEngine fe2 = null;
   
   fe.water();
   car = fe;				// --- (1)
   //car.water(); x			// --- (2)
   fe2 = (FireEngine)car;		// --- (3)
   fe2.water(); //O			// --- (4)

(1). car = (Car)fe; 조상 <- 자손 (Car) 생략 가능
(2). 자손의 메서드water() 사용 못함
(3). fe2 = (FireEngin)car; 자손 <- 조상 (FireEngin)생략 불가능
(4). fe2.water(); 사용 가능
(사용 가능한 이유 : 참조변수 형변환은 참조변수 타입만을 변경할 뿐 변수의 값이나 인스턴스에는 아무런 영향을 주지 않기 때문)




instanceof 연산자

참조변수가 참조하는 인스턴스의 실제 타입을 체크하는데 사용
(해당 타입으로 형변환이 가능한지를 알려준다고 이해하는 것이 더 좋다.)

class InstanceofTest {
   public static void main(String args[]) {
   
      FireEngin fe = new FireEngin();
   
      if (fe instanceof FireEngin) {         // 참조변수 fe가 가르키는 타입이 FireEngine 타입인지 확인
         System.out.println();
      }
   
      if (fe instanceof Car) {
         System.out.println();
      }
   
      if (fe instanceof object) {
         System.out.println();
      }
   }
}

3개 전부 확인 결과 true
(해당 타입으로 형변환이 가능하다는 의미)




참조변수와 인스턴스변수의 연결

멤버변수가 중복정의된 경우, 참조변수의 타입에 따라 연결되는 멤버변수가 달라진다.
(참조변수타입에 영향받음)

메서드가 중복정의된 경우, 참조변수의 타입에 관계없이 항상 실제 인스턴스의 타입에 정의된 메서드가 호출된다.

class Parent {
   int x = 100;
   void method() {
      System.out.println("Parent, Method");
   }
}
class Child extends Parent {
   int x = 200;
   void method() {
      System.out.println("Child Method");
   }
}
-------------------------------------------
public static void main(String[] args) {
   Parent p = new Child();
   Child c = new Child();
   
   System.out.println("p.x = " + p.x);
   p.method();
   
   System.out.println("c.x = " + c.x);
   c.method();
}

//결과
// p.x = 100
// Child Method
-------
//c.x = 200
//Child Method

만약 맴버변수나 메서드가 중복정의 되어있지 않다면
선택의 여지가 없기 때문에 참조변수의 타입에 따라 결과가 달라지지 않는다.
결과가 일치한다.

class Parent {
   int x = 100;
   
   void method() {
      System.out.println("Parent Method");
   }
}

class Child extends Parent { }

-------------------------------------------
public static void main(String[] args) {
   Parent p = new Child();
   Child c = new Child();
   
   System.out.println("p.x = " + p.x);
   p.method();
   
   System.out.println("c.x = " + c.x);
   c.method();
}

//결과
// p.x = 100
// Parent Method
-------
//c.x = 100
//Parent Method
profile
안녕하세요.

0개의 댓글