한모로그 2023. 1. 18. 21:05

자동 타입 변환

  • 자동적으로 타입 변환이 일어나는 것


    출처, 이것이 자바다


  • 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급


    출처, 이것이 자바다


package ch07.sec07.exam01;

//상속관계 구성
class A {}

class B extends A {}

class C extends A {}

class D extends B {}

class E extends C {}


public class PromotionExample {
    public static void main(String[] args) {
        B b = new B(); // B의 부모 A
        C c = new C(); // C의 부모 A
        D d = new D(); // D의 부모 B
        E e = new E(); // E의 부모 C

        //자동형변환. 부모클래스 변수 = (부모클래스)자식객체
        A a1 = b; // A a1 = (A)b;
        A a2 = c;
        A a3 = d;
        A a4 = e;

        B b1 = d;
        C c1 = e;

        /*
         상속및 형변환은 직계에 한해서이다.
         B b3 = e;
         C c2 = d;
         */
    }

}

package ch07.sec07.exam02;

//부모클래스
public class Parent {

    //메소드 선언
    public void method1() {
        System.out.println("Parent-method1()");
    }

    public void method2() {
        System.out.println("Parent-method2()");
    }
}

package ch07.sec07.exam02;

//자식클래스
public class Child extends Parent {
    //메소드 오버라이딩
    @Override
    public void method2() {
        System.out.println("Child-method2()");
    }

    //메소드 선언
    public void method3() {
        System.out.println("Child-method3()");
    }
}

package ch07.sec07.exam02;

public class ChildExample {
    public static void main(String[] args) {

        //자식객체 생성 : 힙영역 Parent, Child클래스 내용을 가지고 각각 메모리 생성
        Child child = new Child();

        //child 객체로 접근가능 한 것은?
        //child.method1() : Parent , child.method2() : Child(재정의), child.method3() : Child(추가)

        child.method1(); //부모 Parent
        child.method2(); //자식 재정의
        child.method3(); //자식 추가

        System.out.println("===부모클래스 형변환 전후===");

        //자동타입변환. 부모클래스변수 = 자식객체;
        Parent parent = child; //호출하는 대상이 부모클래스의 멤버로 한정 재정의는 자식클래스로 한정됨

        //메소드 호출
        parent.method1(); //Parent클래스
        parent.method2(); //Child클래스

        //parent.method3(); 호출 불가능, Child클래스 method3()
    }

}

강제 타입 변환

  • 부모 타입은 자식 타입으로 자동 변환되지 않음. 대신 캐스팅 연산자로 강제 타입 변환 가능


    출처, 이것이 자바다


  • 자식 객체가 부모 타입으로 자동 변환하면 부모 타입에 선언된 필드와 메소드만 사용 가능


    출처, 이것이 자바다


package ch07.sec07.exam03;
//부모클래스
public class Parent {
    //필드 선언
    public String field1;

    //메소드 선언
    public void method1() {
        System.out.println("Parent-method1()");
    }

    public void method2() {
        System.out.println("Parent-method2()");
    }
}

package ch07.sec07.exam03;
//자식클래스
public class Child extends Parent {
    //필드 선언
    public String field2;

    //메소드 선언
    public void method3() {
        System.out.println("Child-method3()");
    }
}

package ch07.sec07.exam03;

public class ChildExample {

    public static void main(String[] args) {
        //1)객체 생성및 자동타입변환, 부모클래스 변수 = 자식객체;

        /*
         Child child = new Child();
         Parent parent = child; 
         */
        Parent parent = new Child();

        parent.field1 = "data1";
        parent.method1();
        parent.method2();

        /*
         부모로 자동 형변환인 경우는 자식클래스의 멤버는 호출불가능(단, 재정의 메소드만 가능)
         parent.field2 = "data2"; //호출 불가능
         parent.method2(); //호출 불가능
         */

        //2)강제타입변환.  Parent parent = new Child(); 이 구문이 앞에서 존재하는 전제조건.
        Child child = (Child) parent;

        //child객체로 Parent, Child 클래스의 모든멤버 호출가능
        child.field2 = "data2";
        child.method3();
    }

}