[JAVA] 다형성(1) - 다형성 참조, 캐스팅, instanceof 연산자
다형성
프로그래밍에서 한 객체가 여러 타입의 객체로 취급할 수 있는 능력
-> 하나의 객체가 다른 타입으로 사용될 수 있다.
다형적 참조
-> 자바에선 부모는 자식을 품을 수 있다.
ex)
Parent poly = new Child();
- Parent Poly는 부모 타입이고 new Child()를 통해 생성된 결과는 Child 타입이다.
- 반대로 자식 타입은 부모 타입 못 담는다. Child child1 = new Parent(); 오류 발생
- 자식 밑에 자식 즉 ,손자 타입이 있다면 그 하위 타입도 참조 가능
Parent poly = new Parnet()
Parent poly = new Child() //Parent 자식
Parent poly = new Grandson() //Child 자식
캐스팅 (Casting)
- 타입을 변환하는 것을 말하며 그냥 형변환이라 생각하면 된다. 자바의 상속 관계에 있는 부모와 자식 클래스 간에 서로 간의 형변환이 가능
■ 업 캐스팅 (UpCasting)
자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것 , 쉽게 말해 현재 타입을 부모 타입으로 변경 하는 것
public class A {
public static void main(String[] args) {
Child child = new Child();
Parent parent1 = (Parent) child;
Parent parent2 = child; //위에 있는 (Parent)생략.
parent1.parentMethod();
parent2.parentMethod();
}
}
- 부모 클래스 Parent, 자식 클래스 Child이다. ParentMethod() 기능을 가진 Parent 클래스만 호출 할 수있다. 지금 child는 부모 타입을 호출하고 싶으니 업캐스팅을 해야한다. 업캐스팅은 타입을 생략 가능하다.
■ 다운 캐스팅 (DownCasting)
업캐스팅 된 것을 다시 원상태로 돌리는 것이며 하위 클래스로의 다운 캐스팅을 할 때는 타입을 명시적으로 지정해줘야한다.
public class AA {
public static void main(String[] args) {
Parent poly = new Child(); //부모 변수가 자식 인스턴스 참조
((Child) poly).childMethod();
}
}
- 부모인 Parent 클래스가 자식의 기능을 다이렉트로 호출할려고 하면 컴파일 오류가 발생한다.
- 일시적인 다운 캐스팅이 필요하여 해당 메서드를 호출하는 순간만 다운캐스팅을 한다.
- ((Child)) poly.childMethod(); 괄호()를 더 추가 한 이유는 먼저 poly를 child 타입으로 변환하고 변환된 객체에 대해 childMethod()를 호출한다.
■ instanceof 연산자
원래 인스턴스의 형이 맞는지 체크하는 키워드이며 true, false로 반환한다.
instanceof 있으면 오른쪽 대상이 왼쪽 대상에 포함이 되는지 확인한다.
ex) parent instanceof Child //parent는 Child의 인스턴스
1) new Child() instanceof Chlid //true
2) new Parent() instanceof Parent //true
3) new Parent() instanceof Child //false