개인공부/[JAVA] / / 2021. 1. 17. 18:29

[JAVA] 묵시적 형변환/ 업캐스팅 (Upcasting)

Java의 묵시적 형 변환/ 업 캐스팅을 알아보기 전에

상속 관계에 있는 상위, 하위 클래스의 생성 과정을 알아봐야 한다.

 

하위 클래스의 생성 

- 하위 클래스가 생성되기 전에 반드시 상위 클래스가 먼저 생성되어야 한다.

- 상위 클래스의 생성자가 호출되고 하위 클래스의 생성자가 호출이 된다.

 

즉, 하위 클래스를 생성하게 되면 자동적으로 Java에서 상위 클래스의 디폴트 생성자를 호출해주고 있던 것이다.

 

   //상위 클래스 디폴트 생성자 
   public Customer(){
        customerGrade="SILVER";
        bonusRatio=0.01;
        System.out.println("Customer 상위 클래스 생성자 호출");
    }
	//하위 클래스의 생성자
	public VIPCustomer(){

        customerGrade="VIP";
        bonusRatio=0.05;
        salesRatio=0.1;
        System.out.println("VIPCustomer 하위 클래스 생성자 호출");
    }

위와 같이 상위 클래스, 하위 클래스의 생성자가 정의되어있는 상태에서 

 

하위 클래스 인스턴스를 생성해보게 되면

 

    public static void main(String args[]) {
    	//하위 클래스 인스턴스 생성
        VIPCustomer customerKim = new VIPCustomer();
    }

 

상위 클래스가 인스턴스가 먼저 생성되고 하위클래스 인스턴스가 생성되는 것을 확인할 수 있다.

 

이는 하위 클래스를 생성할 때 상위 클래스를 먼저 생성하는 생성자가 없는 경우

 

Java에서 상위 클래스의 기본 생성자를 호출해주는 super()를 추가해주기 때문이다.

 

하지만, 만약 상위 클래스의 디폴트 생성자가 정의되어있지 않다면?

 

하위 클래스는 직접 상위 클래스의 생성자를 호출해주어야 한다. (클래스는 생성자를 무조건 하나 가져야 하기 때문에 없을 순 없다.)

 

업 캐스팅(Upcasting)

이제 묵시적 형 변환을 설명해 보면

 

-상위 클래스로 변수를 생성하고, 하위 클래스의 인스턴스를 생성할 수 있다

-하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형 변환이 가능하다.

-상속 관계에서 모든 하위 클래스는 상위 클래스로 묵시적 형 변환이 가능하다. // 역은 성립 X

 

예를 들어

//상위 클래스 - Customer
//하위 클래스 - VIPCustomer
Customer vc = new VIPCustomer(); 

 이 경우를 살펴보면

 

하위 클래스로 인스턴스가 생성되었지만 변수 타입이 상위 클래스이다.

 

하위 클래스 인스턴스가 힙 메모리에 모두 올라왔지만, 변수는 상위 클래스 주소 값만 접근 가능하기 때문에 인스턴스의 모든 값에 접근이 불가하다. 

 

코드로 예시를 들면

public class Customer {//상위 클래스

    private int customerID;
    private String customerName;
    protected String customerGrade;
    int bonusPoint;
    double bonusRatio;

    public Customer(){
        customerGrade="SILVER";
        bonusRatio=0.01;
        System.out.println("Customer 상위 클래스 생성자 호출");
    }
   }
public class VIPCustomer extends Customer{ // 하위 클래스
    double salesRatio;
    private int agentID;

    public VIPCustomer(){

        customerGrade="VIP";
        bonusRatio=0.05;
        salesRatio=0.1;
        System.out.println("VIPCustomer 하위 클래스 생성자 호출");
    }
}

 

Main함수에서 업 캐스팅으로 선언된 customerKim이 하위 클래스 변수 salesRatio에 접근이 되지 않음을 확인할 수 있다.

'개인공부 > [JAVA]' 카테고리의 다른 글

[JAVA] 자바 Scanner 클래스  (0) 2021.12.05
[JAVA] Java 상속과 Protected 접근제어자  (0) 2021.01.17
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유