다형성 - 다운캐스팅과 주의점

Xtraa·2024년 12월 20일

Java 기본 개념

목록 보기
5/7

1. 업캐스팅이 안전하고 다운캐스팅이 위험한 이유

  • 업캐스팅의 경우, 객체를 생성하면 해당 타입의 상위 부모 타입은 모두 함께 생성되기 때문에 위로만 타입을 변경하는 업캐스팅은 메모리 상에 인스턴스가 모두 존재
  • 다운캐스팅의 경우, 인스턴스에 존재하지 않는 하위 타입으로 캐스팅하는 문제가 발생할 수 있다

💡 객체를 생성하면 부모 타입은 모두 함께 생성되지만 자식 타입은 생성되지 않는다

다운캐스팅 그림

  • A a = new B() : A로 업케스팅
  • B b = new B() : 자신과 같은 타입
  • C c = new B() : 하위 타입은 대입할 수 없음, 컴파일 오류
  • C c = (C) new B() : 하위 타입으로 강제 다운캐스팅, 하지만 B 인스턴스에 C와 관련된 부분이 없으므로 잘못된 캐스팅, ClassCastException 런타임 오류 발생

2. instanceof

그러면 참조하는 대상이 다양할때 어떤 인스턴스를 참조하고 있는지 확인하려면 어떻게 해야할까

인스턴스의 타입을 확인하고 싶다면 instanceof 키워드를 사용하면 된다.

public class CastingMain6 {
		public static void main(String[] args) {
		Parent parent1 = new Parent();
		System.out.println("parent1 호출");
		call(parent1);
		
		Parent parent2 = new Child();
		System.out.println("parent2 호출");
		call(parent2);
		}
		
		private static void call(Parent parent) {
				parent.parentMethod();
				//자바 16부터는 instanceof 를 사용하면서 동시에 변수를 선언할 수 있다
				//Child 인스턴스인 경우 childMethod() 실행
				if (parent instanceof Child child) {
				System.out.println("Child 인스턴스 맞음");
				child.childMethod();
				}
		}
}

실행결과

parent1 호출
Parent.parentMethod
parent2 호출
Parent.parentMethod
Child 인스턴스 맞음
Child.childMethod

3. 다형성과 메서드 오버라이딩

💡 기억해야 할 점은 오버라이딩 된 메서드가 항상 우선권을 가진다는 점

  • poly.method() : Parent 타입에 있는 method() 를 실행하려고 한다. 그런데 하위 타입Child.method()가 오버라이딩 되어 있다. 오버라이딩 된 메서드는 항상 우선권을 가진다. 따라서 Parent.method() 가 아니라 Child.method() 가 실행된다.
profile
https://xtraa.notion.site/Xtraa-ed48ac432d354d01b5bf5b0da5ec94a9?pvs=4

0개의 댓글