자바 개념을 확실하게 이해하고 넘어가야 스프링 프레임 워크 공부할 때 어려움이 없을 것 같아서 중요한 개념을 정리하고자한다. 강사님이 이해가 확실히 될 때까지 반복해서 보라고 강조하심!
상속이란 뭘까?
한국인이라면 의미를 짐작할 수 있을 것이다. 물려받는 것 정도?
객체 지향 프로그래밍에서 B클래스가 A 클래스를 상속받으면 B클래스는 A클래스의 멤버 변수와 메서드를 사용할 수 있다. 이 '상속'을 기반으로 프로그램 유지 보수를 유연하게 만들고 새로운 내용을 추가하거나 수정을 쉽게 할 수 있다.
부모 클래스를 '상위 클래스', - Super Class/ Base class
자식 클래스를 '하위클래스'라고 부른다. -Subclass, deprived class
상속의 문법: 예약어, Extends
영어 단어를 통해 짐작할 수 있듯이 상속을 통해 부모 클래스가 가지고 있는 속성이나 기능을 추가로 확장하여 자식 클래스를 구현한다.
상속을 하게되면 일반적인 클래스에서 더 구체적인 클래스를 구현할 수 있게 되는 것이다.
예제를 통해 개념을 확실히 이해해보자.
아래 코드는 부모 클래스인 Customer 클래스이다.
package inheritance;
public class Customer {
protected int customerID; // 고객 아이디
protected String customerName; // 고객 이름
protected String customerGrade; // 고객 등급
int bonusPoint;
double bonusRatio;
public Customer() // 디폴트 생성자
{
customerGrade = "SILVER";
bonusRatio = 0.01;
// System.out.println("Cusomer() 생성자 호출");
}
ㅇ
public Customer(int customerID, String customerName){
this.customerID = customerID;
this.customerName = customerName;
customerGrade = "SILVER";
bonusRatio = 0.01;
// System.out.println("Cusomer(int, String) 생성자 호출");
}
public int calcPrice(int price){
bonusPoint += price * bonusRatio;
return price;
}
public String showCustomerInfo(){
return customerName + " 님의 등급은 " + customerGrade + "이며, 보너스 포인트는 " + bonusPoint + "입니다.";
}
public int getCustomerID() {
return customerID;
}
public void setCustomerID(int customerID) {
this.customerID = customerID;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getCustomerGrade() {
return customerGrade;
}
public void setCustomerGrade(String customerGrade) {
this.customerGrade = customerGrade;
}
}
아래 코드는 부모 클래스인 customer 클래스를 상속받아 생성한 VIPcustomer 클래스이다.
package inheritance;
public class VIPcustomer extends Customer {
private int agentID;
private double saleRatio;
public VIPcustomer() {
customerGrade = "VIP";
bonusRatio = 0.05;
saleRatio = 0.1;
}
public int getagentID() {
return agentID;
}
}
아래 코드는 위 클래스들을 실행할 테스트 코드이다.
package inheritance;
public class CustomerTest1 {
public static void main(String[] args) {
Customer customerLee = new Customer();
customerLee.setCustomerID(10100); // customerID와 customerNAme은 프로텍트 변수이므로 셋 메서드를 호출한다.
customerLee.setCustomerName("Lee");
VIPcustomer customerKim = new VIPcustomer();
customerKim.setCustomerID(20200);
customerKim.setCustomerName("kim");
customerKim.bonusPoint = 10000;
System.out.println(customerKim.showCustomerInfo());
}
}
상속에서 클래스 생성과 형 변환
하위 클래스가 생성될 떄는 상위 클래스의 생성자가 먼저 호출된다. 이 관계를 이해하면 하위 클래스가 상위 클래스의 변수와 메서드를 사용할 수 있는 이유와 하위 클래스가 상위 클래스의 자료형으로 형 변환을 할 수 있는 이유를 이해할 수 있다.
위에 구현한 코드를 이용하여 설명해보도록 하겠다.
테스트 코드에서 VIPcustomer클래스로 선언한 커스토머킴 인스턴스는 상속받은 상위 클래스의 변수를 자기 것처럼 사용할 수 있다.
변수를 사용한다는 것은 그 변수를 저장하고 있는 메모리가 존재한다는 뜻...!
그러나 VIPcustomer 클래스의 코드에는 해당 변수가 존재하지 않는다. customer 클래스를 상속받았을 뿐이다. 어떻게 된 일일까?
자, 상속된 하위 클래스가 생성되는 과정을 되짚어보자. 테스트를 위해 두 코드의 생성자에 출력문을 넣고 출력해보면 상위 클래스를 상속받는 하위 클래스가 생설될 때 상위 클래스의 생성자가 먼저 생성된다는 걸 확인할 수 있다. 그리고 상위 클래스 생성자가 호출될 때 상위 클래스의 멤버 변수가 메모리에 생성된다.
즉, 상위 클래스의 변수가 메모리에 먼저 생성되기에 하위 클래스에서도 이 값들을 모두 사용할 수 있다는 것이다! 여기서 주의할 점은 상위 클래스의 private 변수들이다. 하위 클래스에서 해당 변수를 사용할 수 없었던 이유는 상위 클래스의 변수가 생성되지 않았기 때문이 아니다. private 변수는 생성되지만, 단지 하위 클래스에서 접근할 수 없었을 뿐이다.
다음 글에서 어떤 과정으로 상위 클래스가 생성되는지 공부해보도록 하자!
'공부 STUDY > JAVA' 카테고리의 다른 글
[JAVA] 상속 | 메서드 오버라이딩 (0) | 2023.01.08 |
---|---|
[JAVA] 상속 | 부모를 부르는 예약어, super (0) | 2023.01.08 |
[JAVA] 싱글톤 패턴(Singleton Pattern) - static 응용 (0) | 2023.01.07 |
JAVA 2회독 시작 기록 (0) | 2023.01.03 |
[JAVA] 스프링 시작 전, 생활코딩 JAVA + 수업 완강 회고록(2) (0) | 2022.12.29 |