[Java 객체지향] 상속에서 클래스의 생성과정과 형변환

2022. 1. 30. 21:54·Java

하위 클래스 생성 과정

  • 하위 클래스가 생성되면 상위 클래스가 먼저 생성된다.
  • VIPCustomer 생성자가 먼저 Customer 생성자를 호출한다.

 

Customer 생성자
public Customer() {

    customerGrade = "SILVER";
    bonusRatio = 0.01;

    System.out.println("Customer() call");	// Customer 생성자 호출 시 출력 메세지
}

 

VIPCustomer 생성자
public VIPCustomer() {

    bonusRatio = 0.05;
    saleRatio = 0.1;
    customerGrade = "VIP";

    System.out.println("VIPCustomer() call");	// VIPCustomer 생성자 호출 시 출력 메세지
}

 

VIPCustomer 객체 생성 부
VIPCustomer customerKim = new VIPCustomer();
customerKim.setCustomerName("김유신");
customerKim.setCustomerId(1001);
customerKim.bonusPoint = 10000;
System.out.println(customerKim.showCustomerInfo());

 

수행 결과

Customer 생성자가 먼저 생성된 것을 확인할 수 있다.

Customer() call
VIPCustomer() call
김유신님의 등급은 VIP이며, 보너스 포인트는 10000입니다.

 

Super 키워드

VIPCustomer 생성자에 Customer 생성자를 호출하는 코드가 없는데 어떻게 호출되는 것일까?

  • super는 this와 비슷한 개념
  • 하위 클래스가 상위 클래스의 인스턴스의 참조값을 가지도록 해주기 때문에 멤버변수나 메서드에 접근 가능
  • 또한 상위 클래스의 default 생성자를 호출해준다.
  • 상위 클래스의 default 생성자 호출이 가능하다면 컴파일러가 자동으로 super()를 넣어준다.
  • default 생성자는 상위, 하위 클래스 모두 생성자가 없거나, 하위 클래스에서 명시적으로 생성자를 호출하지 않을 때 호출된다.
  • 만약 상위 클래스에 매개 변수가 있는 생성자만 있다면 하위 클래스의 생성자에서 오류가 발생한다.
  • 이럴땐 하위 클래스의 생성자에서도 매개 변수를 받아 super 키워드를 통해 상위 클래스에 전달해주거나, 하위 클래스에 명시적으로 super에 값을 넣어준다.

 

Customer.java
public Customer(String customerName, int customerId) {	// 매개 변수가 있는 constructor

    this.customerName = customerName;
    this.customerId = customerId;

    customerGrade = "SILVER";
    bonusRatio = 0.01;

}

 

VIPCustomer.java
public VIPCustomer(String customerName, int customerId) {	// 매개변수 받음

    super(customerName, customerId);	// Customer 생성자 명시적으로 호출

    bonusRatio = 0.05;
    saleRatio = 0.1;
    customerGrade = "VIP";

}

 

CustomerTest.java
Customer customerLee = new Customer("이순신",1000);
customerLee.bonusPoint = 1000;
System.out.println(customerLee.showCustomerInfo());

VIPCustomer customerKim = new VIPCustomer("김유신",10000);
customerKim.bonusPoint = 10000;
System.out.println(customerKim.showCustomerInfo());

 

상속에서 인스턴스 메모리 상태

  • 상위 클래스의 인스턴스 먼저 생성되고, 하위 클래스의 인스턴스가 생성된다.
  • 하위 클래스에서도 상위 클래스의 private 변수들도 생성되지만 접근은 하지 못한다.

 

형변환 (업 캐스팅)

  • 상위 클래스 타입으로 변수를 선언하고 하위 클래스의 생성자로 생성할 수 있다.
  • customer는 VIPCustomer 생성자에 의해 모든 VIPCustomer 클래스의 멤버 변수에 대한 메모리는 생성되었지만, 타입이 Customer이기 때문에 Customer 클래스의 멤버 변수와 메서드에만 접근할 수 있다.
Customer customer = new VIPCustomer();

 

  • 상위 클래스 타입의 변수에 하위 클래스 타입의 변수를 대입할 수 있다.
VIPCustomer vCustomer = new VIPCustomer;
addCustomer(vCustomer);

int addCustomer(Customer customer) {
	
}

 

  • 하위 클래스는 상위 클래스를 내포하고 있으므로 상위 클래스로의 묵시적 형변환이 가능하다.
  • 역은 성립하지 않는다.
저작자표시 비영리 변경금지 (새창열림)

'Java' 카테고리의 다른 글

[Java 객체지향] 오버라이딩 (메서드 재정의)  (0) 2022.01.30
[Java 객체지향] 상속 활용 (멤버십 클래스 구현)  (0) 2022.01.30
[Java 객체지향] 상속  (0) 2022.01.30
'Java' 카테고리의 다른 글
  • [Java 객체지향] 메서드의 재정의와 가상 메서드 원리
  • [Java 객체지향] 오버라이딩 (메서드 재정의)
  • [Java 객체지향] 상속 활용 (멤버십 클래스 구현)
  • [Java 객체지향] 상속
suaring
suaring
개발 공부 로그
  • suaring
    Sue's devlog
    suaring
  • 전체
    오늘
    어제
    • 분류 전체보기 (123)
      • Algorithm (2)
      • WEB (8)
      • Spring (26)
      • Java (83)
      • Kotlin (1)
      • Database (1)
      • Infra (0)
      • Git (1)
      • devlog (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
suaring
[Java 객체지향] 상속에서 클래스의 생성과정과 형변환
상단으로

티스토리툴바