본문 바로가기

반응형

이번 글에서는 상속 구조에서 부모 타입으로 자식 객체를 참조할 때의 제한과,
자식 클래스의 고유 기능을 사용하려면 필요한 다운캐스팅(강제 형변환) 방법을 학습합니다.


📦 부모 클래스 (Parent.java)

package ch07.sec07.exam03;

public class Parent {
	public String field1;

	public void method1() {
		System.out.println("Parent-method1()");
	}

	public void method2() {
		System.out.println("Parent-method2()");
	}
}

📦 자식 클래스 (Child.java)

package ch07.sec07.exam03;

public class Child extends Parent {
	public String field2;

	public void method3() {
		System.out.println("Child-method3()");
	}
}

📌 실행 코드 (ChildExample.java)

package ch07.sec07.exam03;

public class ChildExample {
	public static void main(String[] args) {
		Parent parent = new Child(); // 자동 타입 변환 (업캐스팅)

		parent.field1 = "data1";
		parent.method1();
		parent.method2();

		// parent.field2 = "data2"; // (X) 접근 불가
		// parent.method3();        // (X) 접근 불가

		Child child = (Child) parent; // 강제 타입 변환 (다운캐스팅)

		child.field2 = "data2";       // (O)
		child.method3();              // (O)
	}
}

💬 코드 설명

  • Parent parent = new Child();
    → 자식 객체를 부모 타입으로 참조하는 업캐스팅
  • parent.method1() / method2()
    → 부모 타입에 정의된 메서드만 접근 가능
  • parent.field2, method3()
    → ❌ 부모 타입에는 정의되어 있지 않아 컴파일 오류
  • Child child = (Child) parent;
    → 다시 자식 타입으로 강제 형변환 (다운캐스팅)
  • 이후에는 자식 클래스의 필드와 메서드도 모두 사용 가능

💻 실행 결과

Parent-method1()
Parent-method2()
Child-method3()

📌 간단 정리

참조 변수 타입 접근 가능 멤버
Parent field1, method1(), method2()
Child field1, field2, method1(), method2(), method3()

💡 포인트 정리

  • 부모 타입으로 자식 객체를 참조하면 자식의 고유 멤버에는 접근 불가
  • 자식 타입으로 강제 형변환(다운캐스팅)하면 자식의 멤버 사용 가능
  • 전제 조건: 진짜 자식 객체일 경우에만 안전하게 다운캐스팅 가능
  • 다운캐스팅 전에 instanceof 검사로 안전성 확인 가능

📌 정리하자면,
다형성 구조에서는 부모 타입으로 다양한 자식 객체를 다룰 수 있지만,
고유한 기능을 사용하려면 형변환이 필요하다는 점을 꼭 기억해야 해야합니다.

댓글