다형성이란?
다형성이란 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미합니다.
생각을 해보면 부모는 아이일 수 있다.(부모도 누군가의 아들 혹은 딸이기에)
그러나 아이는 부모일 수 없다. 그렇기에 자바에서도 위 사진과 같이 오류를 나타내는 것이다.
그래서 자바에서는 아래와 같이 코드를 수정해줘서 사용한다.
Child child2 = (Child) new Parent();
이를 타입캐스팅(타입 변환)이라고 부르는데 어느 상황에서 타입변환을 할 수 있는지 알아보자.
============================================================
<넘어가기전 다시 이해를 해보자>
더 쉬운 예제로 생각해보면 사람은 남자이다. 사람은 여자이다. 둘 다 말이 된다.
그러나 남자는 사람이다? 여자는 사람이다? --> 의미가 모호해진다
여기서 중요한 점은 남자는 사람으로 표현할 수 있고 여자도 사람으로 표현할 수 있다는 점이다
--> "다형성"
=============================================================
참조 변수의 타입 변환
예를 들어서 Child와 Sister은 Parent를 상속 받은 클래스라고 코드를 짜고 아래와 같은 코드를 실행해보자.
public static void main(String[] args) {
Parent parent1 = new Parent();
Parent parent2 = new Child();
Child child1 = new Child();
Child child2 = (Child) new Parent();
Sister sister = new Sister();
parent1 = child1; // parent1 = (Parent)child1;(2번)
sister = (Sister) parent2; // 타입변환을 생략할 수 없다.(3번)
sister = (Sister) child1; // 직접적인 상속 관계가 아니므로, 오류를 발생시킨다.
}
instanceof
참조변수 instance of 클래스이름
왼쪽에 전달된 참조 변수가 실제로 참조하고 있는 인스턴스의 타입이 오른쪽에 전달된 클래스 타입이면 true를 반환, 아니면 false를 반환한다.
public static void main(String[] args) {
Parent parent = new Parent();
System.out.println(parent instanceof Parent);
System.out.println(parent instanceof Child);
Child child = new Child();
System.out.println(child instanceof Parent);
System.out.println(child instanceof Child);
}