몬그로이

다형성 캐스팅 본문

Dev 언어 정리 & Self QnA/Java

다형성 캐스팅

Mon Groy 2024. 6. 3. 20:00

흔히 부모와 자식의 상속이라고 표현하기 때문에

나 또한 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();