rudu_std
클래스 형변환 본문
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이 발생할 수 있습니다.
업캐스팅 후 자식 클래스에만 있는 메서드를 사용하고 싶을 때 다시 다운캐스팅을 사용하여 자식 클래스에만 있는 메서드를 사용 가능하게 만들 수 있다.
'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 |