객체 지향 프로그래밍의 꽃
다향성은 이름 그대로 다양한 형태, 여러형태 를 뜻한다.
프로그래밍에서 다형성은 한 객체가 여러타입의 객체로 취급될 수 있는 능력을 뜻한다.
다형적 참조 : 부모 타입의 변수가 자식 인스턴스를 참조
//부모 인스턴스가 자식 인스턴스를 참조(다형적 참조)
System.out.println("Parent -> Child");
Parent poly = new Child();
poly.parentMethod();
부모는 자식을 담을 수 있다
자바에서 부모 타입은 자식 타입을 담을 수 있다.
(자식은 부모를 담을 수 없다 Child child1 = new Parent() ==> 이것은 컴파일 오류)
부모타입의 변수 poly 에 Child 인스턴스를 생성해 대입한다
부모는 자식의 기능을 호출할수없다.
poly.childMethod(); ==> 호출 불가하다
Parent 타입으로 만들어진 poly 는 Child보다 높은 단계이다, 때문에 child의 메서드를 가져올수는 없다.(근처 참조는 가능하나 Parent 에 메서드가 없으면 아래까지는 찾아가지 못한다.)
// 부모 변수가 자식 인스턴스 참조( 다형성 참조)
Parent poly = new Child();
// 단 자식의 기능은 호출할 수 없다.
//poly.childMethod(); 불가능
//다운 캐스팅(부모타입 -> 자식타입)
Child child = (Child) poly; // x001
child.childMetod(); // 부모타입을 자식타입으로 잠깐 바꿔서 자식 메서드를 사용
Child child = (Child) poly // 부모타입을 자식타입으로 다운캐스팅
Child child = (Child) x001 // 참조값을 읽은 다음 자식 타입으로 지정한다. 이때 poly 자체를 바꾸는 것이 아닌 복사된 값을 바꾼다
Child child = x001
==> 일시적으로 다운캐스팅해서 하위클래스에 있는 기능 호출하는 과정
- 실제 객체는 바뀌지 않으며, 참조 변수가 자식 타입으로 형변환되어 자식 클래스의 멤버에 접근할 수 있게 된다.
- poly 자체는 바뀌지 않지만 poly가 참조하는 객체를 자식 타입으로 다룰 수 있게 된다.
//일시적 다운 캐스팅 - 해당 메서드를 호출하는 순간 캐스팅
((Child) poly).childMetod();
원래 Parent 타입으로 해석하는걸 Child 타입으로 재해석 한다고 생각하면 이해가 쉬워진다
업캐스팅이 안전하고 다운캐스팅이 위험한 이유
package poly.basic;
public class ChildMain4 {
public static void main(String[] args) {
Parent parent1 = new Child();
Child child = (Child) parent1;
child.childMetod(); // Child 인스턴스 생성됨
Parent parent2 = new Parent();
Child child1 = (Child) parent2;
child1.childMetod(); // Child 인스턴스 생성되지 않음 ClassCastException 예외 발생
}
}
Parent를 상속받은 Child를 생성하게되면 부모 클래스인 Parent 인스턴스 또한 자동으로 생성을 하게된다. 때문에 자식클래스를 사용하게되면 업캐스팅을 자유롭게 하여 부모클래스의 메서드 또한 자유롭게 사용할수 있기때문에 다운캐스팅보단 업캐스팅의 안정성이 훨씬 높다.
'JAVA' 카테고리의 다른 글
[JAVA] instanceof (1) | 2025.02.18 |
---|---|
[JAVA] 런타임 오류 VS 컴파일 오류 (0) | 2025.02.18 |
[JAVA] 상속 (0) | 2025.02.14 |
[JAVA] static final 변수를 사용하는 이유 (1) | 2025.02.07 |
[JAVA] OptionalInt 사용법 - 최솟값, 최댓값 뽑을 때 (Feat. stream) (0) | 2025.02.07 |