Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

rudu_std

클래스 형변환 본문

Java

클래스 형변환

Ru_Du 2024. 7. 24. 19:57

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%85%EC%BA%90%EC%8A%A4%ED%8C%85-%EB%8B%A4%EC%9A%B4%EC%BA%90%EC%8A%A4%ED%8C%85-%ED%95%9C%EB%B0%A9-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0#%EC%97%85%EC%BA%90%EC%8A%A4%ED%8C%85upcasting

class Parent {
	String name;
    int age;
}

class Child extends Parent {
	
    //String name;
    //int age;
    
	int number;
}

Parent p = new Parent(); 
Child c = new Child();

Parent p2 = (Parent)c;	// 업캐스팅 - 자식(c)에서 부모(p)로
Child c2 = (Child)p2;	// 다운캐스팅 - 부모(p)에서 자식(c)으로

부모 객체는 자식 객체에 상속을 받고 있으니 더 상위 요소로 판별. ==  Up 캐스팅

반대로 하위 요소인 자식 객체로 형변환하는 것 == Down 캐스팅

 

형제 클래스 끼리는 타입이 다르기 때문에 참조 형변환 불가능

업캐스팅(UpCasting)

  • 업캐스팅은 자식 클래스가 부모 클래스 타입으로 캐스팅 되는 것.
  • 업캐스팅은 캐스팅 연산자 괄호 생략 가능
  • 단, 부모 클래스로 캐스팅 된다는 것은 멤버의 갯수 감소를 의미.
    이는 곧 자식 클래스에서만 있는 속성과 메서드는 실행하지 못한다는 뜻.
  • 업캐스팅을 하고 메소드를 실행할때, 만일 자식 클래스에서 오버라이딩한 메서드가 있을 경우, 부모 클래스의 메서드가 아닌 오버라이딩 된 메서드가 실행되게 된다.

다운 캐스팅(DownCasting)

  • 다운캐스팅은 거꾸로 부모 클래스가 자식 클래스 타입으로 캐스팅 되는 것이다.
  • 다운캐스팅은 캐스팅 연산자 괄호를 생략할 수 없다
  • 다운캐스팅의 목적은 업캐스팅한 객체를 다시 자식 클래스 타입의 객체로 되돌리는데 목적을 둔다. (복구)

다운 캐스팅은 부모 클래스를 자식클래스로 캐스팅하는 단순히 업캐스팅의 반대 개념이 아니다.

 

다운 캐스팅의 진정한 의미는 부모 클래스로 업 캐스팅된 자식 클래스를 복구하여, 본인의 필드와 기능을 회복하기 위해 있는 것이다. 즉, 원래 있던 기능을 회복하기 위해 다운캐스팅을 하는 것이다. 

다운캐스팅(downcasting) 예외 - 다운캐스팅은 업스캐팅한 객체를 되돌릴때 적용 되는것이지, 오리지날 부모 객체를 자식 객체로 강제 형변환은 불가능


다운캐스팅 업캐스팅 예시

class Parent {
    int parentField = 10;
}

class Child extends Parent {
    int childField = 20;
}

public class Main {
    public static void main(String[] args) {
        Parent p = new Child(); // 업캐스팅
        p.parentField = 30;

        if (p instanceof Child) {
            Child c = (Child) p;  // 다운캐스팅
            System.out.println(c.parentField); // 30 출력
            System.out.println(c.childField);  // 20 출력
        }
    }
}

이 예제에서 Parent p = new Child();는 Child 객체를 생성하고, 이를 Parent 타입으로 업캐스팅하는 과정이다.

여기서 p.parentField = 30;으로 부모 클래스의 필드 값을 변경한다.

이후에 p를 Child 타입으로 다운캐스팅하여 c에 할당할 때,

실제로 새로운 Child 객체가 생성되는 것이 아니라, 기존 Child 객체의 참조 타입을 Parent에서 Child로 변경하여 접근할 수 있게 되는 것이다.

다운캐스팅 후에도 c.parentField와 c.childField는 원래 Child 객체에 설정된 값을 그대로 유지한다.

다시 말해, p와 c는 메모리 상에서 동일한 객체를 가리키고 있으며, 이 객체는 초기화된 이후로 상태가 변하지 않는다.

따라서 다운캐스팅 과정에서 새로운 인스턴스가 생성되지 않고, 기존 객체의 필드 값을 그대로 사용할 수 있다. 

다운캐스팅은 객체의 참조 타입을 바꾸는 것이지, 새로운 객체를 생성하는 것이 아니다.

자바에서는 new 키워드를 사용하지 않는 한 새로운 인스턴스가 생성되지 않는다.

업캐스팅과 다운캐스팅은 기존 객체에 대해 다른 타입으로 접근하는 방법을 제공하며, 이를 통해 부모 클래스와 자식 클래스의 기능을 적절히 활용할 수 있습니다. 다운캐스팅할 때는 instanceof 연산자를 사용하여 실제 타입을 확인하는 것이 안전한 프로그래밍을 위해 중요합니다. 그렇지 않으면 잘못된 다운캐스팅으로 인해 ClassCastException이 발생할 수 있습니다.

 

업캐스팅 후 자식 클래스에만 있는 메서드를 사용하고 싶을 때 다시 다운캐스팅을 사용하여 자식 클래스에만 있는 메서드를 사용 가능하게 만들 수 있다.

 

 

 

 

출처 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%97%85%EC%BA%90%EC%8A%A4%ED%8C%85-%EB%8B%A4%EC%9A%B4%EC%BA%90%EC%8A%A4%ED%8C%85-%ED%95%9C%EB%B0%A9-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0#%EC%97%85%EC%BA%90%EC%8A%A4%ED%8C%85upcasting

'Java' 카테고리의 다른 글

JDBC  (0) 2024.08.01
람다 표현식 (Lambda Expression)  (0) 2024.07.24
static  (0) 2024.07.21
this  (0) 2024.07.19
접근 제한자 (public, private, protected, default)  (0) 2024.07.18