- 한 객체가 여러 타입의 객체로 취급될 수 있는 능력.
- 부모 클래스의 참조 변수에 자식 클래스의 객체들을 대입해서 다루는 것을 의미함.
- 핵심은 "부모는 자식을 담을 수 있다" 이다.
p.parentMethod(); 는 호출이 가능하지만, p.childMethod();는 호출할 수 없음. public class Parent{
// 부모 클래스 객체
}
public class Child extends Parent{
// 자식 클래스 객체
}
public class PolyMain{
public static void main(String[] args{
// 부모 클래스 참조 변수에 자식 클래스 인스턴스를 참조
Parent p = new Child();
// Child 인스턴스 생성 시, Parent인스턴스, Child 인스턴스 둘 다 생성됨
p.parentMethod(); // 호출 가능
p.childMethod(); // 호출 불가능
}
}
업 캐스팅(Up casting)
자식 타입 객체 -> 부모 타입 객체로 형변환 되는 것을 의미함.다운 캐스팅(Down Casting)
부모 타입 객체 -> 자식 타입 객체로 형변환 되는 것을 의미함.자식 인스턴스 생성(부모 인스턴스도 같이 생성) -> 자식 인스턴스를 부모 인스턴스로 업캐스팅 -> 이를 다시 자식 인스턴스로 다운 캐스팅 하는 과정에서만 사용. // 부모 클래스 객체
public class Parent{
// 부모한테만 있는 메서드
public void parentMethod(){
...
}
// 오버라이드 하는 메서드
public void over(){
System.out.println("부모");
}
}
// 자식 클래스 객체
public class Child extends Parent{
// 자식한테만 있는 메서드
public void childMethod(){
...
}
// 오버라이드 하는 메서드
public void over(){
System.out.println("자식");
}
}
public class PolyMain{
public static void main(String[] args{
// 부모 클래스 참조 변수에 자식 클래스 인스턴스를 참조
// Child 인스턴스 생성 시, Parent인스턴스, Child 인스턴스 둘 다 생성됨
Parent p = new Child();
// Child 인스턴스가 Parent 참조 변수에 캐스팅 됨 -> 업 캐스팅
p.parentMethodd();
p.childMethod(); // -> 오류 발생
p.over(); // -> '자식'이 출력됨.
// Parent 참조형을 Child 형으로 다시 다운 캐스팅
((Child)p).parentMethod();
((Child)p).childMethod();
((Child)p).over(); // -> '자식'이 출력됨.
}
}
- 자식 클래스의 객체를 생성하면 부모 객체도 같이 생성이 되기 때문에 위로만 타입을 변경하는 업캐스팅의 경우 항상 안전함. 이 때문에 따로 명시적으로 타입을 적지 않아도 괜찮음.
- 부모 클래스의 객체를 생성하면 자식 객체는 생성되지 않는데, 이는 어떤 자식의 객체를 생성할지를 모르기 때문. 이 때문에 다운 캐스팅의 경우, 하위 타입의 객체가 생성되어 있는지를 꼭 확인하고 진행해야 함.
instance of :인스턴스가 어떤 인스턴스를 참조하는지를 확인하는 키워드 p instance of Class : p가 참조하는 객체가 Class 형인지? (왼쪽 p가 Class에 들어갈 수 있는 객체인지 대입해보면 됨)public class Parent{
// 부모 클래스 객체
}
public class Child extends Parent{
// 자식 클래스 객체
}
public class PolyMain{
public static void main(String[] args{
Parent p = new Child();
System.out.println(p instanceof Child); // true
}
}