컴퓨터공학 💻 도서관📚

Part2. 3-3 상속에서 클래스 생성 과정과 형 변환 본문

✅🌲강의 복습 노트/패캠 JavaSpring 강의,코드 복습

Part2. 3-3 상속에서 클래스 생성 과정과 형 변환

들판속초록풀 2025. 5. 22. 17:29

어떻게 하위 클래스만 생성했는데도 상위 클래스의 멤버 변수나 메서드를 다 호출해서 쓸 수 있을까?

 

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

하위 클래스가 생성이 될 때  상위 클래스가 먼저 생성 된다

new VIPCustomer() 호출하면 Customer() 가 먼저 호출된다. 

클래스가 상속 받은 경우 하위 클래스의 생성자에서는 반드시 상위 클래스의 생성자를 호출한다


 

super 키워드

super 키워드는 하위 클래스가 상위 클래스 인스턴스의 참조 값을 가지게 한다 --> 하위 클래스에서 상위 클래스 꺼 쓸 수 있게 함

또한 super 키워드는 this 와 마찬가지로 생성자를 호출할 수 있는 기능이 있다.  --> 상위 클래스의 생성자를 호출한다.

 

 

상속을 받은 클래스에서는 상위 클래스의 생성자를 호출해야 한다.

그런데 하위 클래스에  상위 클래스의 생성자를 호출하는 코드가 없는 경우

컴파일러가 마치 기본 생성자처럼   super();   super 키워드를 넣어준다.

super();  는 상위 클래스의 기본 생성자를 호출한다.  -->   ( ) 안에 아무것도 없는 것은,  명시적으로 호출하지 않은 것은
                                                                                        기본 생성자를 호출한다


 

그런데 만약 상위 클래스에서 기본 생성자가 아닌 생성자를 직접 만들고,  컴파일러가 super();를 넣어줬을 때는

하위 클래스에서 오류가 발생한다  -->  기본 생성자가 없기 때문이다

 

이럴 때는 상위 클래스 생성자를 이제 내가 명시적으로 직접 호출해야 한다.

그 전에는 묵시적으로 컴파일러가 넣어줬지만 지금은 그렇게 호출될 수 있는 생성자가 없기 때문이다

그래서 super 키워드로 직접 호출해야 한다.

super는 생성된 상위 클래스 인스턴스의 참조 값을 가지므로

super를 이용하여 상위 클래스의 메서드나 멤버 변수에 접근할 수 있다.

 

// 디폴트 생성자 없애고 매개 변수가 있는 생성자 추가

public Customer(int customerID, String customerName) {     // 직접 만든 생성자
		this.customerID = customerID;
		this.customerName = customerName;
		
		customerGrade = "SILVER";
		bonusRatio = 0.01;
		System.out.println("Customer(int, String) 생성자 호출");
}

 

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

public VIPCustomer(int customerID, String customerName) {

		super(customerID, customerName);    // super 키워드를 이용하여 상위 클래스 멤버변수에 접근
		
		customerGrade = "VIP";
		bonusRatio = 0.05;
		salesRatio = 0.1;
		
		System.out.println("VIPCustomer(int, String) 생성자 호출");
}

 

public class CustomerTest {

	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());
	}
}

 

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

 

멤버변수가 private 인 경우에는 메모리 공간이 안 만들어지는가?

-->  아니다  만들어지는데 접근을 못 하는 것일 뿐이다.

 


 

* 형 변환 (업캐스팅)

 

하위 클래스는 상위 클래스의 것들을 내포하고 있기 때문에  하위 클래스 인스턴스가 상위 클래스로 묵시적 형변환이 된다

 

 

 

 

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

Customer customerLee = new VIPCustomer();

 

 

*  상위 클래스 타입의 매개변수하위 클래스 변수가 대입

int addCustomer(Customer customer){

}

VIPCustomer vCustomer = new VIPCustomer();

addCustomer(vCustomer);

 

 

 

 

하위 클래스가 상위 클래스로 형변환이 되는 건 업캐스팅이고

이미 상위 클래스로 형변환이 된 게 원래 자기 인스턴스 타입으로 오는 건 다운 캐스팅이라고 한다.

 

형 변환은 묵시적으로, 자동으로 일어난다

단, 이 과정의 역은 성립하지 않는다 


 

*  형 변환과 메모리

 

 

Customer vc = new VIPCustomer(); 에서 vc가 가리키는 것은?   -->  Customer 이다

 

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

 

 

 

Comments