본문 바로가기
JAVA

[JAVA] 다형성1

by 집돌이디벨로퍼 2025. 2. 18.

객체 지향 프로그래밍의 꽃

 

다향성은 이름 그대로 다양한 형태, 여러형태 를 뜻한다.

프로그래밍에서 다형성은 한 객체가 여러타입의 객체로 취급될 수 있는 능력을 뜻한다.

 

다형적 참조 : 부모 타입의 변수가 자식 인스턴스를 참조

     //부모 인스턴스가 자식 인스턴스를 참조(다형적 참조)
        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 인스턴스 또한 자동으로 생성을 하게된다. 때문에 자식클래스를 사용하게되면 업캐스팅을 자유롭게 하여 부모클래스의 메서드 또한 자유롭게 사용할수 있기때문에 다운캐스팅보단 업캐스팅의 안정성이 훨씬 높다.