[ 학습목표 ]
- 다형성의 개념을 이해한다.
- 업캐스팅과 다운캐스팅의 차이를 이해하고 사용할 수 있다.
- 부모 타입 참조 변수로 자식 객체를 다루는 패턴에 익숙해진다.
[ 이론 ]
1. 다형성이란?
- 하나의 객체가 여러 형태로 동작할 수 있는 성질
2. 다형성 특징
- 자식 객체를 부모 타입으로 참조할 수 있음
- 오버라이딩 메서드가 핵심
- 실행 시점에 어떤 메서드가 호출될지는 객체의 실제 타입에 따라 결정됨
3. 업캐스팅 Upcasting
부모클래스 변수 = new 자식클래스(); // 자동 형변환
- 자식이 부모처럼 행동
- 오버라이딩된 메서드는 자식 것이 호출됨
4. 업캐스팅 사용 이유/목적/예시
- 다형성을 활용하기 위해: 여러 하위 클래스를 같은 상위 클래스 타입으로 다룰 수 있음.
- 코드를 유연하게 설계할 수 있음: 예를 들어 매개변수나 반환 타입이 상위 타입이면 여러 하위 타입을 수용할 수 있음.
- 안전한 변환이며 명시적 형변환이 필요 없음.
🔹 사용 예시:
- 컬렉션에 다양한 하위 타입 객체를 상위 타입으로 저장할 때.
- 메서드 인자로 상위 클래스를 받을 때 다양한 하위 클래스 전달 가능.
5. 다운캐스팅 Downcasting
자식클래스 변수 = (자식클래스) 부모클래스변수; // 강제 형변환
- 업캐스팅한 객체를 다시 자식 타입으로 되돌림
- instanceof 연산자와 함께 자주 사용
6. 다운캐스팅 사용 이유/목적/예시
- 하위 클래스의 고유 기능(메서드/필드)에 접근하기 위해.
- 다형성을 통해 업캐스팅된 객체를 원래 타입으로 되돌릴 때.
🔹 주의사항:
- 명시적 형변환이 필요함.
- 실제 객체가 해당 타입이어야 함. 그렇지 않으면 ClassCastException이 발생함.
7. 언제 사용되는가
상황 | Upcasting | Downcasting |
다형성을 활용할 때 | ✅ 자주 사용 | ❌ 일반적으로 사용 안 함 (단, 필요 시 사용) |
하위 클래스 기능 접근 필요 시 | ❌ 기능 접근 불가 | ✅ 기능 접근 가능 |
안전성 | ✅ 안전 | ❗ 위험 (런타임 오류 가능성 있음) |
[ 실습 ]
✅ 예시 1: 업캐스팅과 오버라이딩
class Animal {
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍!");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹!");
}
}
public class Main {
public static void main(String[] args) {
Animal a1 = new Dog(); // 업캐스팅
Animal a2 = new Cat(); // 업캐스팅
a1.sound(); // 멍멍!
a2.sound(); // 야옹!
}
}
✅ 예시 2: 다운캐스팅
Animal animal = new Dog();
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.sound(); // 멍멍!
}
[ 메모 ]
- 다형성이란 하나의 타입이 여러 형태로 동작하는 성질을 말한다.
- 업캐스팅은 자식 클래스를 부모 타입으로 자동 형변환이 된다.
- 다운캐스팅은 부모 클래스를 자식 타입으로 강제 형변환 해야 한다.
- 다형성을 활용할 때 업캐스팅은 자주 사용되나 다운캐스팅은 런타임 시 ClassCastException이 발생할 가능성이 있기 때문에 위험하다.
- 그리고 업캐스팅은 자식 클래스가 부모 타입으로 된 것이라서, 부모 클래스의 기능만 사용할 수 있다. 단, 부모 클래스의 hello라는 메서드를 자식 클래스의 오버라이딩 했다면, 부모 클래스의 hello 메서드를 호출하더라도 자기 자신이 오버라이딩한 hello메서드의 내용이 동작한다.
- 다운캐스팅은 부모 클래스가 자식 타입으로 된 건데, 이때 자식 클래스의 기능을 사용할 수 있다.
'공부 기록 > Java with ChatGPT' 카테고리의 다른 글
[Java/ChatGPT] Day 12: 예외 처리 (Exception Handling) (0) | 2025.06.21 |
---|---|
[Java/ChatGPT] Day 11: 추상 클래스와 인터페이스(Abstrac Class & Interface) (0) | 2025.06.19 |
[Java/ChatGPT] Day 9: 메서드 오버라이딩(Method Overriding)과 super 키워드 (0) | 2025.06.19 |
[Java/ChatGPT] Day 8: 상속(Inheritance)의 개념과 기본 사용법 (0) | 2025.06.17 |
[Java/ChatGPT] Day 7: 생성자 오버로딩 (Constructor Overloading) (0) | 2025.06.16 |