다형성과 캐스팅
- 다운캐스팅
- 부모타입의 형태를 자식타입의 형태로 강제로 형변환을 시켜주는것
// 다움캐스팅 (부모타입 -> 자식타입)
Child child = (Child) poly;
// <- 이렇게 사용하면 강제로 부모티입을 자식타입으로 변환 시킨다.
child.childMethod();
→ 이렇게 사용하면 자식 타입에서 호출한 주소를 사용하는 부모가 자식 타입의 기능을 찾게 해준다.
- 실행 순서 🔽
Child child = (Child) poly // 다운 캐스팅을 통해 부모 타입을 자식 타입으로 변환한 다음 대입 시도
Child child = (Child) x001 // 참조 값을 읽은 다음 자식 타입으로 지정
Child child = x001 // 최종 결과
→ 주소 값을 복사하여 읽어온다는걸 기억하자
- 업 캐스팅
- 부모 타입으로 변경
캐스팅의 종류
- 일시적 다운 캐스팅
- → 자식 캐스팅을 일일히 선언하고 사용 하기 번거로워 해당 메서드를 호출하는 순간에만 다운 캐스팅을 하는것을 말한다.
// 일시적 다운캐스팅 - 해당 메서드를 호출하는 순간만 다운캐스팅
((Child) poly).childMethod();
→ Parent 타입의 poly 를 호출 할 때에 기존 참조에서는 Parent 에서 찾았지만 일시적 다운 캐스팅을 하면 Child 에 바로 찾으러 간다.
- 업 캐스팅
- → 다운 캐스팅과 반대로 자식 타입을 부모 티입으로 바꾸는것을 말한다.
package poly.basic;
// upCasting cs downCasting
public class CastingMain3 {
public static void main(String[] args) {
Child child = new Child();
Parent parent1 = (Parent) child; // 업 캐스팅은 생략 가능, 생략 권장
Parent parent2 = child; // 업 캐스팅 생략 -> 이렇게 사용해야 한다.
parent1.parentMethod();
parent2.parentMethod();
}
}
→ 부모 타입은 자식 타입을 담을 수 있기 때문에 업 캐스팅 시에는 부모타입 형변환을 생략할 수 있다.
다운 캐스팅과 주의점
- 다운 캐스팅을 잘못하면 심각한 런타임 오류가 발생할 수 있다.
package poly.basic;
// 다운 캐스팅을 자동으로 하지 않는 이유
public class CastingMain4 {
public static void main(String[] args) {
//---------------------------------------------------
Parent parent1 = new Child();
Child child1 = (Child) parent1;
// 부모의 크기로 자식을 담은 모양은 자식에 바로 못 들어 간다.
child1.childMethod(); // 문제 없이 실행 됨
//---------------------------------------------------
Parent parent2 = new Parent();
Child child2 = (Child) parent2;
// 부모 자체를 자식에 담게 되면 런타임 오류 생성
child2.childMethod(); // 실행 불가
//---------------------------------------------------
}
}
→ 문제없이 실행된 경우 🔽
→ 자식 객체로 생성한 부모타입 변수에는 자식과 부모의 영역이 모두 생성 되어있기 때문에 다운 캐스팅 하여 호출이 가능하능하다.
→ 다운 캐스팅중 문제가 발생한 경우 🔽
→ 부모 객체로 생성한 부모 타입 변수 내부에는 자식 영역이 존재 하지 않기 때문에 런타임 오류가 발생 하게 된다.
다운 캐스팅 결론
- 자바 에서는 사용할 수 없는 타입으로 다운캐스팅 하는 경우에 예외를 발생시키고 프로그램을 종료 시키기 때문에 다운 캐스팅 사용 할때는 주의를 기울여야 한다.
업캐스팅이 안전하고 다운 캐스팅이 위험한 이유
- 업캐스팅의 경우는 다운캐스팅 처럼 호출 대상이 존재 하지 않는 경우가 없다. → 이유는 해당 타입의 상위 부모 타입은 모두 함깨 생성 되기 때문에 업 캐스팅의 경우 문제가 없다.
- 하지만 다운 캐스팅의 경우 부모 타입의 객체를 생성 할때에 자식 타입은 생성 하지 않기 때문에 → 개발자 다운 캐스팅 사용시 항상 주의를 하여 사용해야 한다.
컴파일 오류 VS 런타임 오류
- 컴파일 오류 : 변수명 오타, 잘못된 클래스등 자바 실행전 발생하는 오류로, IDE 에서 즉시 확인 하는 안전한 오류다.
- 런타임 오류 : 말 그대로 프로글매 실행중 발생하는 오류, 고객이 프로그램 실행도중 발생하기 때문에 매우 안좋은 오류다.
'자바 공부 > [ 完 ] 자바 실전 - 기본편' 카테고리의 다른 글
10-4. 다형성 - 메서드 오버라이딩 (0) | 2024.03.19 |
---|---|
10-3. 다형성 - instanceof (0) | 2024.03.19 |
10-1. 다형성 - 이론과 다형적 참조 (0) | 2024.03.19 |
8-2. 클래스와 메서드에 사용되는 final (상속 이해 필요) (0) | 2024.03.14 |
9-3 상속과 접근제어 (0) | 2024.03.14 |