Burninghering's Blog
article thumbnail

1. 하위 클래스가 생성 되는 과정

  • 하위 클래스를 생성하면 상위 클래스가 먼저 생성 됨
  • new VIPCustomer()를 호출하면 Customer()가 먼저 호출 됨
  • 클래스가 상속 받은 경우 하위 클래스의 생성자에서는 반드시 상위 클래스의 생성자를 호출 함

Customer.java

	public Customer() { 
		customerGrade="SILVER";
		bonusRatio=0.01;
		
		System.out.println("Customer() call");
	}

VIPcustomer.java

		public VIPcustomer() {
			bonusRatio=0.05;
			salesRatio=0.1;
			customerGrade="VIP"; 
			
			System.out.println("VIPcustomer() call");
		}

CustomerTest.java

package ch03;

public class CustomerTest {

	public static void main(String[] args) {
//		Customer customerLee = new Customer();
//		customerLee.setCustomerName("이순신");
//		customerLee.setCustomerID(10010);
//		customerLee.bonusPoint=1000;
//		
//		System.out.println(customerLee.showCustomerInfo());
		
		
		VIPcustomer customerkim = new VIPcustomer();
		customerkim.setCustomerName("김유신");
		customerkim.setCustomerID(10020);
		customerkim.bonusPoint=10000;
		
		System.out.println(customerkim.showCustomerInfo());
	}
}

 

결과

 

2. super 키워드

역할 : 

  • 하위 클래스에서 가지는 상위 클래스에 대한 참조 값
  • super()는 상위 클래스의 기본 생성자를 호출 함
  • super는 생성된 상위 클래스 인스턴스의 참조 값을 가지므로 super를 이용하여 상위 클래스의 메서드나 멤버 변수에 접근할 수 있음

 

1 ) 상위 클래스의 기본 생성자가 존재할 때 :

하위 클래스에서 명시적으로 상위 클래스의 생성자를 호출하지 않으면 컴파일러가 super() 호출해줌

 

2 ) 상위 클래스의 기본 생성자가 없을 때 : ( ex) 한 두개의 속성 변수를 받는 다른 생성자가 있는 경우 )

하위 클래스에서는 생성자에서는 super를 이용하여 명시적으로 상위 클래스의 생성자를 호출 함

 

Customer.java

package ch03;

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;
			System.out.println("Customer(int, String) 생성자 호출");
	}

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

빨간 오류가 생기며, JVM에서 생성자를 만들어준다고 한다

VIPCustomer.java

package ch03;

public class VIPcustomer extends Customer {

		double salesRatio;
		String agentID;

		// super를 이용하여 상위 클래스의 생성자 명시적으로 호출
		public VIPcustomer(int customerID, String customerName) {
		super(customerID, customerName);

		customerGrade = "VIP";
		bonusRatio = 0.05;
		salesRatio = 0.1;
		
		System.out.println("VIPCustomer(int, String) 생성자 호출");
	}
}

CustomerTest.java

package ch03;

public class CustomerTest {

	public static void main(String[] args) {
		Customer customerLee = new Customer(1000,"이순신");
		customerLee.bonusPoint=1000;
		
		System.out.println(customerLee.showCustomerInfo());
		
		
		VIPcustomer customerkim = new VIPcustomer(10020,"김유신");
		customerkim.bonusPoint=10000;
		
		System.out.println(customerkim.showCustomerInfo());
	}
}

결과

 

 

 

 

2. 상속에서 인스턴스 메모리의 상태

항상 상위 클래스의 인스턴스가 먼저 생성되고, 하위 클래스의 인스턴스가 생성 됨

private 변수도 만들어지지만, 접근을 못하는 것일 뿐!

 

 

 

3. 형 변환(업캐스팅)

상위 클래스로 변수를 선언하고, 하위 클래스의 생성자로 인스턴스를 생성

-> VIPcustomer의 인스턴스는 Customer 타입으로 대입될 수 있다.

Customer customerLee = new VIPCustomer();
//VIPCustomer는 Customer 타입을 내포하고 있기 때문에

 

상위 클래스 타입의 변수에 하위 클래스 변수가 대입가능

-> addCustomer의 인자는 Customer타입이어야 하는데 vCustomer가 인자로 들어가있다.

VIPCustomer vCustomer = new VIPCustomer();
addCustomer(vCustomer);
int addCustomer(Customer customer){
}

 

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

상속 관계에서 모든 하위 클래스는 상위 클래스로 형 변환(업캐스팅)이 된다.
( 그 역은 성립하지 않음)

 

 

4. 형 변환과 메모리

Customer vc = new VIPCustomer();

Customer vc = new VIPCustomer(); 에서 vc가 가리키는 것은? :

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

 

 

5. 클래스의 계층구조가 여러 단계인 경우

Human은 내부적으로 Promate와 mammal의 타입을 모두 내포하고 있음

Primate pHumman = new Humman();

Mammal mHumman = new Humman();

 

 

6. 형변화를 사용하는 이유

많은 클래스들이 존재하고 클래스들 끼리의 관계를 형성하면서 프로그램을 구성하게 된다.

따라서 다양한 객체를 생성하고 그 객체들간의 관리의 필요성이 생겨나기 마련이다.

 

이렇듯 서로 다른 데이터형을 묶어줘야 할때, 즉 관리를 해야할 때

최소한 상속의 관계 또는 구현의 관계에 속해있는 객체들을

형변환하여 관리할 수 있다는 것은 아주 효율적이다.

profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.