본문 바로가기
JAVA/객체지향

자바 자동타입변환(업케스팅 형변환) 의미, 사용 방법

by 스코리아 2023. 8. 29.

안녕하세요, 스코리아입니다.

오늘은 자바의 자동타입변환(업케스팅 형병환)의 의미와 사용방법에 대해서 알아보겠습니다.

 

자동 타입변환이란?

  • 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 뜻함
  • 자식 클래스의 타입은 부모 클래스 타입으로 자동 타입 변환이 일어날 수 있음
  • 자식 클래스는 부모 클래스의 타입을 내포하고 있으므로 부모 클래스로의 묵시적 형 변환이 가능함
  • 상속 관계에서 모든 자식 클래스는 부모 클래스로 형 변환(업캐스팅)이 됨 (단, 그 역은 성립하지 않음)
  • 부모클래스 변수 = 자식 클래스 타입

 

자동 타입변환된 이후

  • 부모 클래스에 선언된 필드와 메소드만 접근 가능
  • 메소드가 자식 클래스에서 재정의되었다면, 자식 클래스의 재정의된 메소드가 호출 (다형성의 특징)

 

자동 타입변환의 예시

이전 시간에 예시로 만들었던 Customer와 VIPCustomer 클래스를 활용하여 자동 타입변환에 대해서 설명하겠습니다.

이전 "자바의 상속" 내용 참고하기 : https://skorea6.tistory.com/21

 

우선 상위 클래스인 Cusomer 클래스를 만들기 위해 Customer.java 파일을 만들어봅시다.

public class Customer {
    protected int customerID;
    protected String customerName;
    protected String customerGrade;
    int bonusPoint;
    double bonusRatio;

    public Customer(int customerID, String customerName) {
        this.customerID = customerID;
        this.customerName = customerName;

        customerGrade = "SILVER";
        bonusRatio = 0.01;
    }

    public String showCustomerInfo() {
        return customerName + "님의 등급은 " + customerGrade + "이며, 보너스 포인트는" + bonusPoint + "입니다";
    }
}

 

그 후, Customer 클래스의 하위 클래스인 VIPCustomer 클래스를 만들기 위해 VIPCustomer.java 파일을 만들어봅시다.

public class VIPCustomer extends Customer {
    private int agentID;
    double salesRatio;
    
    public VIPCustomer(int customerID, String customerName) {
        super(customerID, customerName);

        customerGrade = "VIP";
        bonusRatio = 0.05;
        salesRatio = 0.1;
    }

    public int getAgentID() {
        return agentID;
    }
}

 

상위 클래스인 Customer 클래스와 하위 클래스인 VIPCustomer 클래스를 이용하여 업케스팅 형변환을 사용해 보기 위해 CustomerTest 클래스를 만들어봅시다.

public class CustomerTest {
    public static void main(String[] args) {
        // 형 변환 (업캐스팅)
        Customer customerPark = new VIPCustomer(10021, "박유신");
        customerPark.bonusPoint = 10000;
        System.out.println(customerPark.showCustomerInfo());
    }
}

자동타입형변환 방법

  • 상위 클래스인 Customer를 변수 타입으로 선언하고 new 키워드를 이용하여 하위 클래스인 VIPCustomer의 생성자로 인스턴스를 생성합니다.
  • 즉, "상위(부모) 클래스 변수 = 하위(자식) 클래스 변수" 형식으로 설정합니다.
  • 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로의 묵시적 형 변환이 가능합니다.

  • 자동타입변환이 된 customerPark를 이용해서 showCustomerInfo 메소드를 호출하면, 우선 자식 클래스의 재정의된 메소드가 있으면 자식클래스의 재정의된 메소드를 호출하고, 없으면 부모 클래스의 메소드를 호출하게 됩니다.
  • 여기서는 자식 클래스인 VIPCustomer 클래스에 showCustomerInfo 메소드가 재정의 되어있으므로, 자식 클래스의 재정의된 메소드가 호출됩니다.

여기서 중요한 점이 있습니다.

  • 변수의 타입이 Customer이므로 Customer클래스의 멤버 변수와 메소드만 사용 가능합니다.
  • 즉, 부모 클래스에 정의된 메소드, 멤버 변수만 호출이 가능합니다. 자식 클래스에서만 정의된 메소드, 멤버 변수는 호출이 불가합니다.

 

형변환과 메모리

Customer customerPark = new VIPCustomer();

 위 코드에서 customerPark가 가리키는 것은 무엇일까요?

  • VIPCustomer() 생성자에 의해 VIPCustomer 클래스의 모든 멤버 변수에 대한 메모리는 생성되었지만, 변수의 타입이 Customer 이므로 실제 접근 가능한 변수나 메서드는 Customer의 변수와 메서드입니다.

자동타입변환 - 힙 메모리 구조
자동타입변환 - 가져올 수 있는 메소드, 멤버변수

  • 즉, 하위 클래스인 VIPCustomer의 멤버변수인 agentId와 salesRatio는 가져올 수 없습니다.

 


지금까지 자바(Java)의 자동타입변환(업케스팅 형변환)의 의미와 사용방법에 대해서 알아보았습니다.

읽어주셔서, 감사합니다.