Java 업캐스팅과 instanceof 연산자

백엔드·2020년 10월 12일
0

자바 문법

목록 보기
3/5

클래스 형변환

부모타입으로 자식객체를 참조하게 되면 부모가 가지고 있는 메소드만 사용할 수 있다. 자식객체가 가지고 있는 메소드나 속성을 사용하고 싶다면 형변환 해야 한다.

형변환

    public class Car{
        public void run(){
            System.out.println("Car의 run메소드");
        }
    }

    public class Bus extends Car{
        public void ppangppang(){
            System.out.println("빵빵.");
        }   
    }

상속관계란 is a 관계라고 말했었습니다. Bus는 Car다. 라는 관계가 성립되는 것이죠.
현실에서도 우리는 버스를 가리키면서 차다. 라고 말하곤 합니다.

  • 부모타입으로 자식객체를 참조할 수 있다.

부모타입으로 자식객체를 참조하게 되면 부모가 가지고 있는 메소드만 사용할 수 있다.

public class BusExam{
       public static void main(String args[]){
           Car car = new Bus();
           car.run();
           car.ppangppang(); // 컴파일 오류 발생
       }
   }
  • ppangppang()메소드를 호출하고 싶다면 Bus타입의 참조변수로 참조해야 한다.
public class BusExam{
     public static void main(String args[]){
         Car car = new Bus();
         car.run();
         //car.ppangppang(); // 컴파일 오류 발생

         Bus bus = (Bus)car;  //부모타입을 자식타입으로 형변환 
         bus.run();
         bus.ppangppang();
     }
 }
  • 객체들 끼리도 형변환이 가능하다. 단 상속관계에 있었을 때만 가능하다.

  • 부모타입으로 자식타입의 객체를 참조할 때는 묵시적으로 형변환이 일어난다.

  • 부모타입의 객체를 자식타입으로 참조하게 할때는 명시적으로 형변환 해주어 한다. 단 이렇게 형변환 할때에는 부모가 참조하는 인스턴스가 형변환 하려는 자식타입일 때만 가능하다.

=> car가 참조하는 객체가 원래 Bus 였기 때문에 가능하다.
즉, 실제로 생성되었을 때의 Bus였기 때문에 가능 .
Car car = new Car();일 경우 불가능하다.


Instance 연산자

다음과 같이 Person 클래스와 이를 상속받는 클래스들이 있다고 하자

class Person {
	.....
}

class Student extends Person{
	.....
}

class Researcher extends Person{
	.....
}

class Professor extends Researcher{
	.....
}
person p = new Person();
person p = new Student();
person p = new Researcher();
person p = new Professor();

이와 같은 경우에 Person 타입의 레퍼런스 p가 있을때, p가 person 객체를 가리키는지, student 객체를 가리키는지, professor 객체를 가리키는지 알 수 없다

=> 레퍼런스가 가리키는 객체가 어떤 클래스 타입인지 구분하기 위해, 자바에서는 instanceof 연산자를 사용한다

레퍼런스 instanceof 클래스명

Person jae = new Student();
if(jae instanceof Person) // true
if(Jae instanceof Student) // true
if(jae instanceof professor) // false


정리

profile
백엔드 개발자

0개의 댓글