Study/Java

Java - 상속_다형성과 Casting

서한성 2022. 7. 6. 17:20

다형성(polymorphism)이란?

같은 타입이지만 실행 결과가 다양한 객체로 대입 가능한 성질

부모타입에는 모든 자식 객체가 대입 가능하다. 

예를 들면 부모클래스 Parent와 자식 클래스 Child가 있을 때

Parent parent = new Child();

위 코드가 가능하다는 뜻이다. 

 

그러나 여기서 parent를 Child 의 인스턴스와 똑같이 생각하면 안되는 이유가 있다.

예를 들어 설명해보면

 

Parent class

public class Parent {
    //    필드
    int field1;

    //    메소드
    public void method1() {
        System.out.println("Parent : method1");
    }
    public void method2() {
        System.out.println("Parent : method2");
    }
}

Child class

public class Child extends Parent {
    //    필드
    int field2;
    //    메소드
    @Override
    public void method2() {
        System.out.println("Child : method2");
    }

    void method3() {
        System.out.println("Child : method3");
    }
}

라고 했을 때, 

public class CastingExample {
    public static void main(String[] args) {
        Parent parent = new Child();
        parent.field1 = 20;
//        parent.field2 = 30;       접근 불가

        parent.method2();
        parent.method1();
//        parent.method3();         접근 불가
//        부모클래스 = new 자식 클래스 로 형변환한 경우 부모의 필드, 메소드만 접근 가능하고 재정의한 경우 자식의 메소드를 호출한다.
    }
}

위와 같이 Child에만 있는 메소드나 필드에서는 접근할 수 없고, Override한 경우 Child의 메소드를 호출한다는 것.

 

이 것을 가능하게 하기 위한 방법이 Casting(형변환)이다.

위에서 주석으로 처리된 코드를

((Child) parent).method3();
((Child) parent).field2 = 30;

이렇게 강제 형변환을 해주면 오류가 뜨지 않는다.

실행해보면

위를 보면 Override하지 않은, Child에만 있는 method3이 실행된 것을 볼 수 있다.