상속 - 🐥 카카오 테크 캠퍼스
새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(inheritance) 받아 속성이나 기능을 확장하여 클래스를 구현한다
이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할 때 클래스를 상속한다
상속의 표현 방법 : Extends
class B extends A {}
- 상속하는 클래스 : 상위 클래스, 부모 클래스, super class
- 상속받는 클래스 : 하위 클래스, 자식 클래스, derived class, sub class
상속을 구현하는 경우
자바는 단일 상속만을 지원하며, 상위 클래스에 일반적인 개념과 기능을, 하위 클래스에는 더 구체적인 개념과 기능을 구현한다
Example : Customer && VIP Customer
Customer : 일반 고객 : 상위 클래스
public class Customer{
private int customerID:
private String customerName;
public String customerGrade;
int bonusPoint;
double bonusRatio;
public Customer(){
customerGrade = "SILVER";
bonusRatio = 0.01;
}
}
VIP Customer : 우수 고객 : 하위 클래스
public class VIPCustomer extends Customer{
private int agentID;
double salesRatio;
public VIPCustomer(){
customerGrade = "VIP";
bonusRatio = 0.05;
salesRatio = 0.1;
}
}
- 하위 클래스는 부모 클래스로부터 필드 값을 이미 상속 받았다
정책에 따라 등급을 계속 부여하고, 기능을 추가하면 클래스의 단일성이 깨지기 때문에 상속은 필수이다
조건문이 많으면 상속을 해야하나 고민해볼 필요가 있다
하위 클래스가 생성 되는 과정
임의의 클래스가 상속 받은 경우 하위 클래스의 생성자에서는 반드시 상위 클래스의 생성자를 호출합니다
즉 위의 예시에서 VIP Customer가 호출 되면 Customer 클래스의 생성자가 먼저 호출이 됩니다
명시적으로 상위 클래스의 생성자를 호출 할 수 있지만, 만약 상위 클래스의 생성자를 호출하지 않을 수 있습니다
이 때 자동으로 상위 클래스를 Super 키워드로 불러옵니다
public VIPCustomer(){
super()// 이와 같이 상위 클래스를 호출하는 것이 숨겨져있다고 생각하면 됩니다
customerGrade = "VIP";
bonusRatio = 0.05;
salesRatio = 0.1;
}
한 발자국 더! : 상속에서 인스턴스의 메모리 상태
상속에서 하위 클래스는 상위 클래스의 생성자를 호출하여 부모 클래스의 필드와 메서드를 초기화하게 됩니다.
그렇기 때문에, 하위 클래스는 부모 클래스의 필드와 메서드를 모두 포함하게 됩니다.
힙 메모리는 객체가 생성되고 할당되는 영역입니다. 객체를 생성하면, 해당 객체의 클래스 정보, 인스턴스 변수(필드), 그리고 메서드에 대한 참조가 힙 메모리에 저장됩니다.
하위 클래스의 인스턴스를 생성하면, 힙 메모리에 다음과 같은 정보가 저장됩니다.
- 하위 클래스의 정보
- 하위 클래스의 인스턴스 변수
- 상위 클래스의 인스턴스 변수
- 하위 클래스와 상위 클래스의 메서드에 대한 참조
하위 클래스 객체는 상위 클래스의 필드와 메서드를 모두 포함하므로, 힙 메모리에는 상위 클래스와 하위 클래스의 모든 정보가 저장됩니다.
이렇게 함으로써 상속 관계를 통해 하위 클래스는 상위 클래스의 필드와 메서드를 사용할 수 있게 됩니다.
하지만, 메서드는 코드 영역에 위치하고 있어서 실제 메모리 공간을 차지하지 않습니다.
인스턴스가 생성될 때 힙 메모리에 할당되는 것은 메서드에 대한 참조입니다. 따라서 메서드의 중복 저장 문제는 발생하지 않으며 메모리 효율성이 보장됩니다.
그렇다면, 상속 관계가 길어지면, 메모리 낭비가 있지 않는가?
상속 관계가 길어질수록, 하위 클래스는 상위 클래스들의 모든 인스턴스 변수와 메서드에 대한 참조를 포함하게 됩니다.
이로 인해 상속 체인이 길어질수록 메모리 사용량이 증가할 수 있습니다.
그러나 이러한 메모리 사용량 증가는 상속 체인의 길이와 클래스 간 관계의 복잡성에 따라 다를 수 있습니다.
메모리 사용량 증가는 주로 인스턴스 변수에 의해 발생합니다.
메서드의 경우 코드 영역에 위치하고 있기 때문에, 메모리 공간을 차지하지 않으며 인스턴스가 생성될 때 힙 메모리에 할당되는 것은 메서드에 대한 참조입니다. 이렇게 되면 메서드의 중복 저장 문제는 발생하지 않습니다.
레퍼런스
- 자바는 싱글 상속을 한다
- 자바가 추구하는 것은 심플하고 안정적인 것을 원했다
- 자바의 단일 상속만 지원하는 것은 상속으로 인해 발생하는 모호성을 없앴다
- 접근 제어자
- protected : 상위 클래스에서 선언된 private 멤버 변수는 하위 클래스에서 접근 할 수 없다
- Super 키워드
- 형변환(업캐스팅)
- 🌱80x86 시스템 메모리의 구조와 동작
- 힙이랑 메모리 구조 다시 잡고 가자
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Java' 카테고리의 다른 글
Is-A와 HAS-A 또는 Inheritance와 Composition - 🐥 카카오 테크 캠퍼스 (0) | 2023.04.27 |
---|---|
다형성(Polymorphism) (0) | 2023.04.27 |
Overriding(재정의) (0) | 2023.04.27 |
Super 키워드 (0) | 2023.04.26 |
형변환(업캐스팅) (0) | 2023.04.26 |