컴퓨터공학 💻 도서관📚
Part2. 3-3 상속에서 클래스 생성 과정과 형 변환 본문
어떻게 하위 클래스만 생성했는데도 상위 클래스의 멤버 변수나 메서드를 다 호출해서 쓸 수 있을까?
* 하위 클래스가 생성 되는 과정
하위 클래스가 생성이 될 때 상위 클래스가 먼저 생성 된다
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의 변수와 메서드임
'✅🌲강의 복습 노트 > 패캠 JavaSpring 강의,코드 복습' 카테고리의 다른 글
Part2. 3-4 메서드 재정의하기 (overriding) (1) | 2025.05.22 |
---|---|
Part2. 3-2 상속을 활용한 멤버십 클래스 구현하기 (0) | 2025.05.21 |
Part2. 3-1 객체 간의 상속의 의미 (0) | 2025.05.20 |
Part2. 2-24. ArrayList를 활용한 간단한 성적 산출 프로그램 (0) | 2025.05.20 |
Part2. 2-23 객체 배열을 구현한 클래스 ArrayList (리스트) (1) | 2025.05.19 |