Java

업캐스팅 다운캐스팅

99duuk 2025. 1. 7. 22:19

1. 기본 개념

  • 업캐스팅(Upcasting): 하위 클래스 객체를 상위 클래스 타입으로 변환. 자동으로 이루어지며, 상위 클래스의 멤버만 사용할 수 있음.
  • 다운캐스팅(Downcasting): 상위 클래스 타입의 참조를 하위 클래스 타입으로 변환. 명시적으로 캐스팅해야 하며, 하위 클래스의 고유 멤버를 사용하려는 경우 필요.

2. 예

상속 관계:

class Parent {
    public String parentField = "Parent Field";

    public void parentMethod() {
        System.out.println("Parent Method");
    }
}

class Child extends Parent {
    public String childField = "Child Field";

    public void childMethod() {
        System.out.println("Child Method");
    }
}

3. 사용 사례

(1) 업캐스팅

하위 클래스 객체를 상위 클래스 타입으로 변환 (자동):

public static void main(String[] args) {
    Child child = new Child(); // Child 객체 생성
    Parent parent = child; // 업캐스팅 (자동)

    // Parent 타입으로 접근 가능한 멤버
    System.out.println(parent.parentField); // "Parent Field"
    parent.parentMethod(); // "Parent Method"

    // Parent 타입으로는 Child 고유 멤버에 접근 불가
    // System.out.println(parent.childField); // 컴파일 에러
    // parent.childMethod(); // 컴파일 에러
}

결론

  • 업캐스팅은 상위 클래스 타입으로 참조를 제한하기 때문에, 하위 클래스의 고유 멤버는 사용할 수 없음.
  • 이유: 상위 클래스는 하위 클래스의 구체적인 정보를 모름.

(2) 다운캐스팅

상위 클래스 타입의 참조를 하위 클래스 타입으로 변환 (명시적):

public static void main(String[] args) {
    Parent parent = new Child(); // 업캐스팅
    Child child = (Child) parent; // 다운캐스팅 (명시적)

    // 다운캐스팅 후 Child 타입의 멤버 사용 가능
    System.out.println(child.parentField); // "Parent Field"
    System.out.println(child.childField); // "Child Field"
    child.parentMethod(); // "Parent Method"
    child.childMethod(); // "Child Method"
}

결론

  • 다운캐스팅을 통해 하위 클래스 타입의 고유 멤버를 사용할 수 있음.
  • 이유: parent가 실제로 Child 객체이기 때문에, 다운캐스팅이 가능.

(3) 업/다운캐스팅 없이 사용

하위 클래스 객체를 그대로 사용:

public static void main(String[] args) {
    Child child = new Child(); // Child 객체 생성

    // 모든 멤버 사용 가능
    System.out.println(child.parentField); // "Parent Field"
    System.out.println(child.childField); // "Child Field"
    child.parentMethod(); // "Parent Method"
    child.childMethod(); // "Child Method"
}

결론

  • 캐스팅 없이 사용하면 상위 클래스와 하위 클래스의 모든 멤버에 접근 가능.
  • 이유: Child 객체는 상위 클래스의 모든 멤버를 상속받아 포함하고 있기 때문.

4. 업캐스팅과 다운캐스팅 비교

특징 업캐스팅(Upcasting) 다운캐스팅(Downcasting)

의미 하위 클래스 → 상위 클래스 타입으로 변환 상위 클래스 → 하위 클래스 타입으로 변환
명시적 여부 자동 (명시적 캐스팅 필요 없음) 명시적 캐스팅 필요
목적 상위 클래스의 멤버만 사용 하위 클래스 고유 멤버를 사용
위험성 없음 타입이 다르면 ClassCastException 발생 가능
사용 가능한 멤버 상위 클래스에 정의된 멤버만 사용 가능 상위 + 하위 클래스의 모든 멤버 사용 가능

5. 캐스팅의 핵심 요약

  1. 업캐스팅
    • 하위 클래스는 상위 클래스의 모든 멤버를 상속받기 때문에, 추가적인 캐스팅 없이 바로 사용 가능.
    • 상위 클래스 타입으로 다룰 때, 하위 클래스의 고유 멤버는 숨겨짐.
  2. 다운캐스팅
    • 상위 클래스 타입으로 선언된 객체를 다시 하위 클래스 타입으로 변환하여, 하위 클래스의 고유 멤버를 사용.
    • 객체의 실제 타입이 하위 클래스여야만 성공.
  3. 캐스팅 없이 사용
    • 하위 클래스 객체를 하위 클래스 타입으로 선언하면, 상위 클래스와 하위 클래스의 모든 멤버를 자유롭게 사용 가능.

6. 안전한 다운캐스팅

다운캐스팅은 위험할 수 있으므로 instanceof를 활용하여 안전성을 확인하는 것이 좋다고함.....

if (parent instanceof Child) {
    Child child = (Child) parent;
    child.childMethod();
} else {
    System.out.println("parent는 Child 타입이 아닙니다.");
}

결론

  • 업캐스팅은 코드의 유연성과 재사용성을 위해, 다운캐스팅구체적인 동작을 위해 사용.
  • 하위 클래스는 상위 클래스의 모든 멤버를 자동으로 포함하므로 추가적인 캐스팅 없이 사용할 수 있.
  • 캐스팅 없이 설계할 수 있다면 캐스팅을 최소화하는 것이 가독성과 안정성에 유리.

'Java' 카테고리의 다른 글

리플렉션  (0) 2025.01.12
LSP  (0) 2024.12.29
리스트처리(for -> forEach), switch (enum), Null(Optional)  (1) 2024.12.25
추상화....인터페이스...  (0) 2024.12.24
클라이언트 ip 가져오기  (0) 2024.12.24