다형성 캐스팅
흔히 부모와 자식의 상속이라고 표현하기 때문에
나 또한 Parent(부모) 와 Childe(자식) 이라고 표현하겠다
Parent 가 Child 에게 extend 해 준다
Parent 클래스는 Child 클래스에 비해 추상적이다
Child 클래스는 Parent 클래스에 비해 논리적이다
그렇기 때문에 상속이 되면 개념의 범위가 달라진다
개념이 더 좁혀지고, 메서드는 더 구체적이 된다
하지만, 필드값은 변화가 없다
Parent 클래스는 개념의 범위가 더 크기 때문에 더 큰 창고가 필요하다
Child 클래스는 개념의 범위가 더 작기 때문에 더 작은 창고라도 충분하다
그렇기 때문에
Parent 타입을 담을 수 있는 A 는 Child 타입의 인스턴스를 받을 수 있다
하지만 Child 타입을 담을 수 있는 B 는 Parent 타입의 인스턴스를 받을 수 없다
필드 값은 고정된 값이므로 Parent 와 Child 둘 다 서로 가지는 구성품이다
Parent 클래스에 정의되는 메서드가 더 추상적이기 때문에 로직이 간단하다
Child 클래스에 정의되는 메서드가 더 구체적이기 때문에 로직이 복잡하다
따라서
Child 타입을 담은 Parent 타입을 담는 A라고 할지라도 Child 클래스의 메서드를 사용할 수는 없다
Parent 타입을 담은 Child 는 있을 수 없기 때문에 논외이다
하지만
캐스팅이라는 기능을 이용하면
Child 타입을 담을 수 있는 B도 강제로 Parent 타입의 인스턴스를 받을 수 있다
Parent parent1 = new Parent;
Parent parent2 = new Child;
Child child = new Child;
Parent parent3 = child;
Child child1 = (Child) parent1;
Child child2 = (Child) parent2;
Child child3 = (Child) parent3;
|
cs |
-> child1
Parent 타입을 받은 Parent 타입의 parent1을 받는 경우로
Child타입을 담는 그릇으로는 Parent 타입을 받을 수 없어 논외(미스캐스팅, 컴파일 오류)
-> child2
Child 타입을 받은 Parent 타입의 parent2 를 받는 경우
처음부터 Child 타입을 받았기에 child2 가 가지게 되는 건 Child 타입이므로
Child 클래스의 메서드를 사용할 수 있다
즉, child2.childMethod(); 가능
child2.parentMethod(); 가능
-> child3
Child 타입을 받은 child 를, Parent 타입을 받는 parent3 가 받았는데
그 parent3를 Child 타입을 받는 child3 가 받는 경우
child3는 Child 클래스의 메서드를 사용할 수 있다
즉, child3.childMethod(); 가능
child3.parentMethod(); 가능
@Override
Parent 클래스의 메서드를 Child 클래스에서 재정의 후 표시할 때 사용
앞서
Child 타입을 담은 Parent 타입을 담는 A라고 할지라도 Child 클래스의 메서드를 사용할 수는 없다
라고 이야기 했었다
하지만 @Override 를 설정한 후에는 아래와 같다
Parent parent = new Child;
parent.ParentValue; 의 결과는 parent.parentValue; 인 반면,
parent.ParentMethod(); 의 결과는 child.ChildMethod(); 가 된다
비교
Parent paretn = new Parent
parent.ParentValue; 의 결과는 parent.ParentValue;
parent.ParentMethod(); 의 결과는 parent.ParentMethod();