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