고양이를 가리킬 수 있는 손가락 -> 고양이
사람을 가리킬 수 있는 손가락 -> 사람
그렇다면 생물을 가리킬 수 있는 손가락이라면?
이처럼 업 캐스팅은
기본 클래스의 포인터(생물을 가리키는 손가락)로
파생 클래스의 객체를 가리키는 것을 말한다.
업캐스팅(upcasting)
서브 클래스의 레퍼런스를 슈퍼 클래스 레퍼런스에 대입즉 슈퍼 클래스 레퍼런스로 서브 클래스 객체를 가리키는 것
class Person{}
class Student extends Person {}
Person p;
Student s = new Student();
p = s; // 업캐스팅 슈퍼 클래스 p로 서브 클래스 s를 가르킴
물론 슈퍼 클래스 레퍼런스로는
객체 내의 슈퍼 클래스 멤버만 접근 가능하다.
다운캐스팅
슈퍼클래스 레퍼런스를 서브 클래스 레퍼런스에 대입업캐스팅 된 것을 원래대로 되돌리는 것.
반드시 명시적으로 타입 변환을 지정해야함
class Person {}
class Student extends Person{}
Person p = new Student("정근녕"); // 업캐스팅
Student s = (Student)p; // 다운캐스팅 & 명시적으로 강제 타입 변환
그래서 instanceof 연산자를 사용한다.
객체레퍼런스 instanceof 클래스타입
Person p = new Professor();
//Professor - Researcher이자 Person 타입이기도 함
if(p instanceof Person) // true
if(p instanceof Student) // false
if(p instanceof Researcher) // true
if("java" instanceof String) // true
if(3 instanceof ~~int~~) // 문법 오류 : instanceof는 객체에 대한 레퍼런스에만 사용