업캐스팅?
자식 클래스가 부모 클래스 타입으로 캐스팅 되는 것
특징
- 명시적 형변환 연산자 생략 가능
- 부모 클래스에 정의된 필드, 메소드만 접근 가능
- 자식 클래스에서 오버라이딩 된 메소드는 실제 객체 타입에 따라 실행된다(런타임 다형성)
업캐스팅 사용 시 주의 사항
필드, 메소드 갯수가 제한되어 자식 클래스에 있는 필드, 메소드는 사용할 수 없게 된다.
자식 객체를 부모 타입으로 참조했기 때문에 부모 클래스에 정의된 필드, 메소드만 접근할 수 있다.
오버라이딩 된 메소드는 자식 메소드로 실행된다.
실제 객체 타입(자식 클래스)의 것이 실행된다. (다형성)
업캐스팅을 왜 사용하는가?
다양한 자식 객체를 부모 타입으로 통일해 관리
자식 클래스가 많아도 하나의 인스턴스로 묶어서 관리할 수 있다.
다운캐스팅?
부모 클래스 타입의 객체를 자식 클래스 타입으로 캐스팅 하는 것
특징
- 반드시 명시적 형변환 연산자(괄호)가 필요하다.
- 업캐스팅 된 객체만 다운캐스팅이 가능하다.
- 자식 클래스의 고유 맴버(필드, 메소드)에 접근할 수 있다.
다운캐스팅 사용 시 주의사항
잘못된 다운캐스팅 시 런타임 오류(ClassCastException) 가 발생
instanceof 연산자로 확인하는 게 좋음
반드시 업캐스팅 된 부모 객체만 다운캐스팅 해야한다.
기본형 캐스팅의 경우 값 손실만 발생하지만 업캐스팅 되지 않은 생 부모 클래스는 다운캐스팅 시 런타임 에러 발생
다운캐스팅을 왜 사용하는가?
업캐스팅한 객체를 되돌리려고 사용
하나의 인스턴스로 통합해 관리한 부모 객체를 다운캐스팅 함으로써 자식 고유 맴버(필드, 메소드)에 접근할 수 있기 때문에 사용한다.