tuter77

Java : 상속(3) super, 메모리, 업캐스팅 본문

JavaStudy

Java : 상속(3) super, 메모리, 업캐스팅

tuter77 2023. 1. 29. 20:09

● super 키워드

- 하위 클래스에서 가지는 상위 클래스에 대한 참조 값

- super() 는 상위 클래스의 기본 생성자를 호출 한다.

- 하위 클래스에서 명시적으로 상위 클래스의 생성자를 호출하지 않으면, super()가 호출된다.(이때 반드시 상위 클래스의 기본 생성자가 존재해야한다.)

- 상위 클래스의 기본생성자가 없는 경우에(다른 생성자가 있는 경우) 하위 클래스에서는 생성자에서는 super를 이용하여 명시적으로 상위 클래스의 생성자를 호출한다.

- super는 생성된 상위 클래스 인스턴스의 참조 값을 가지므로 super를 이용하여 상위 클래스의 메서드나 멤버변수에 접근할 수 있다.

 

정리하면 하위클래스가 생성될 때는 무조건 상위클래스가 먼저 생성되고 호출되는데, 아무것도 없으면 super()를 자바가 자동으로 제공해서 default 생성자를 호출하게 된다.

그러나 default 생성자가 없는 경우에 개발자가 직접 명시적으로 호출해야한다. 

 

예시)

//	public Customer() { 
//		
//		customerGrage = "SILVER";
//		bonusRatio = 0.01;
//		
//		System.out.println("Customer() call");
//		
//	}
	public Customer(int customerId, String customerName) {
		this.customerId = customerId;
		this.customerName = customerName;
		
		customerGrage = "SILVER";
		bonusRatio = 0.01;
		
		System.out.println("Customer(int, String) call");
	}

Default Constructor를 주석처리하고 아래에 명시적으로 만든 Customer 클래스 Constuctor.

 

//	public VIPCustomer() { //자바에서 자동으로 default 생성자를 호출하는 super()를 암묵적으로 넣어줌.
//		
//		//super(0, "no-name"); // 상위 클래스 호출 
//		bonusRatio = 0.05;
//		salesRatio = 0.1;
//		customerGrage = "VIP";
//		
//		System.out.println("VIPCustomer() call");
//	}
	
	public VIPCustomer(int customerId, String customerName) { //디폴트 생성자를 주석처리하니 상위 클래스 호출 에러가 나서 자바에서 자동으로 제공.
		super(customerId, customerName);

		customerGrage = "VIP";
		salesRatio = 0.1;
		bonusRatio = 0.05;
		
		System.out.println("VIPCustomer(int, String) call");
	}

상위 클래스의 Default Constructor가 없어지니 기존의 super()가 제공된 상위클래스 호출구문에 에러가 떴다. 

때문에 기존의 코드를 주석처리하고,super를 이용하여 상위클래스의 생성자를 명시적으로 호출하는 코드이다.

 

	public static void main(String[] args) {

		Customer customerLee = new Customer(10010, "이순신"); //

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

		customerKim.bonusPoint = 10000;
		System.out.println(customerKim.showCustomerInfo());
		
	}

기존의 테스트 코드 역시 Default Constructor를 참조하고 있었기 때문에 오류가 발생해 위와 같이 새로 만든 생성자에 맞춰 수정된 코드이다.

 

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

- 항상 상위 클래스의 인스턴스가 먼저 생성되고 하위 클래스의 인스턴스가 생성된다.

 

▷형변환(업캐스팅)

- 하위 클래스는 상위 클래스의 속성을 모두 갖고있으므로, 하위 클래스의 생성자를 상위 클래스로 변수를 선언하고 인스턴스를 생성하는 것이 가능하다.

예시) Customer customerLee = new VIPCustumer();

 

- 상위 클래스 타입의 변수에 하위클래스 변수가 대입하는 것도 가능하다.

	VIPCustomer vCustomer = new VIPCustomer();
	addCustomer(vCustomer);

	int addCustomer(Customer customer){
    }

정리하면, 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로의 묵시적 형 변환이 가능하다.
상속 관계에서 모든 하위 클래스는 상위 클래스로 형 변환(업캐스팅)이 된다.

 

이를 예제에서 활용해보면 상위클래스 타입으로 형변환된 하위클래스의 변수는 상위클래스의 메서드만 사용이 가능한 것을 확인할 수 있다.

만약 해당 변수가 하위클래스의 메서드를 사용해야한다면, 다운캐스팅으로 다시 형변환 해야한다.

(이는 지정된 메모리 타입의 문제이기 때문.)

위 내용은 2023.01.03에 공부한 내용입니다.

링크 : https://dudwls3278.tistory.com/34