다형성과 캐스팅

  • 다운캐스팅
    • 부모타입의 형태를 자식타입의 형태로 강제로 형변환을 시켜주는것
// 다움캐스팅 (부모타입 -> 자식타입)
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 에서 즉시 확인 하는 안전한 오류다.
  • 런타임 오류 : 말 그대로 프로글매 실행중 발생하는 오류, 고객이 프로그램 실행도중 발생하기 때문에 매우 안좋은 오류다.

+ Recent posts