| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- 클래스 상속
- AWS
- tomcat
- 클래스 class
- Algorism study
- crud
- MVC 패턴
- Entity
- Sts
- 국비지원교육
- 게시판 리뷰 만들기
- Interface
- GIT
- group study
- #패스트캠퍼스 #국비지원교육 #메가바이트스쿨 #MegabyteSchool #개발자취업부트캠프 #내일배움카드
- array
- 메가바이트스쿨
- spring boot
- MVC
- 패스트캠퍼스
- Java
- #javaStudy
- View
- github
- 개발자취업부트캠프
- MegabyteSchool
- Spring
- side project
- 게시판 만들기
- 내일배움카드
- Today
- Total
tuter77
Java : 상속(3) super, 메모리, 업캐스팅 본문
● 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에 공부한 내용입니다.
'JavaStudy' 카테고리의 다른 글
| Java : 다운 캐스팅, instanceOf (0) | 2023.01.29 |
|---|---|
| Java : 상속(4) method overriding, 가상메서드, 다형성 (0) | 2023.01.29 |
| Java : 상속(2) 및 복습. (0) | 2023.01.29 |
| Java : 상속, 배열(로테이션) (0) | 2023.01.29 |
| Java : 배열(2), 2차원 배열, ArrayList (0) | 2023.01.29 |