티스토리 뷰
Goal
1. 상속의 의미를 알아본다
2. 상속을 사용하는 이유를 알아본다
3. 고객관리 프로그램 실습을 통해 상속을 Java 코드로 구현해본다.
4. 상속이 이루어질 때, 하위 클래스가 생성되는 과정을 이해한다.
5. 업캐스팅(묵시적 형 변환)에 대해 알아본다.
1. 클래스에서 상속의 의미
- 새로운 클래스를 정의 할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능이 확장되는 클래스를 구현함.
- 상속하는 클래스 : 상위 클래스, parent class, base class, super class
- 상속 받는 클래스 : 하위 클래스, child class, derived class, subclass
- Java에서는 다중 상속이 불가능하다.
class B extends A {
}
2. 상속을 사용하는 경우.
- 좀더 확장된 클래스를 만들고 싶을 때 상속을 사용한다.
- 상위 클래스는 하위 클래스 보다 일반적인 개념과 기능을 가짐
- 하위 클래스는 상위 클래스 보다 구체적인 개념과 기능을 가짐
ex) 사람은 포유류의 특징을 갖지만, 더 복잡한 여러가지 특징들이 있음, 이때, 포유류의 특징에 사람의 기능을 추가하기 위해 포유류를 상속받는 사람객체를 생성함.
class Mammal {
}
class Human extends Mammal {
}
3. 상속 실습
- Customer 클래스를 상속받아 기능이 더 추가된 VIPCustomer 클래스 구현하기
3-1 Customer 클래스 코드
* Protected 예약어
- 외부 클래스에는 private으로 하위 클래스에서는 public의 기능을 구현한 접근제어자
- 상위 클래스에 protected로 선언된 변수나 메서드는 다른 외부 클래스에서는 사용할 수 없지만 하위 클래스에서는 사용가능
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;
}
//보너스 포인트 적립.
public int calcPrice(int price) {
bonusPoint += price * bonusRatio;
return price;
}
public String showCustomerInfo() {
return customerName + "님의 등급은 " + customerGrade + "이며, 적립된 보너스 포인트는 " + bonusPoint + "점 입니다.";
}
public int getCustomerID() {
return customerID;
}
public String getCustomerName() {
return customerName;
}
public String getCustomerGrade() {
return customerGrade;
}
public void setCustomerID(int customerID) {
this.customerID = customerID;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public void setCustomerGrade(String customerGrade) {
this.customerGrade = customerGrade;
}
}
3-2 VIPCustomer 클래스 코드
package inheritance;
public class VIPCustomer extends Customer {
double salesRatio;
private int agentID;
public VIPCustomer() {
customerGrade = "VIP";
bonusRatio = 0.05;
salesRatio = 0.1;
}
}
3-3 CustomerTest 클래스 코드
package inheritance;
public class CustomerTest {
public static void main(String[] args) {
Customer customerLee = new Customer();
customerLee.setCustomerName("이순신");
customerLee.setCustomerID(10010);
customerLee.bonusPoint = 1000;
System.out.println(customerLee.showCustomerInfo());
VIPCustomer customerKim = new VIPCustomer();
customerKim.setCustomerName("김유신");
customerKim.setCustomerID(10020);
customerKim.bonusPoint = 10000;
System.out.println(customerKim.showCustomerInfo());
}
}
4. 하위 클래스가 생성되는 과정
- 하위 클래스가 생성 될 때 상위 클래스가 먼저 생성 됨. 즉, 상위 클래스의 생성자가 호출되고 하위 클래스의 생성자가 호출 됨
- 하위 클래스의 생성자에서는에서는 무조건 상위 클래스의 생성자가 호출되어야 함. 하위 클래스에서 상위 클래스의 생성자를 호출하는 코드가 없는 경우 컴파일러는 상위 클래스 기본 생성자를 호출하기 위한 super()를 추가함.
- super()로 호출되는 생성자는 상위 클래스의 기본 생성자 임.
- 만약 상위 클래스의 기본생성자가 없는 경우 ( 매개변수가 있는 생성자만 존재 하는 경우) 하위 클래스는 명식적으로 상위 클래스의 생성자를 호출해야 함
5. 상속에서의 메모리 상태
- 상위 클래스의 인스턴스가 먼저 생성이 되고, 하위 클래스의 인스턴스가 생성 됨
6. 상위 클래스로의 묵시적 형 변환(업캐스팅)
- 상위 클래스의 형으로 변수를 선언하고 하위 클래스 인스턴스를 생성 할 수 있음.
- 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형변환이 가능 함
- 상속관계에서 모든 하위 클래스는 상위클래스로 묵시적 형 변환이 됨. 그 역은 성립하지 않음.
7. 형 변환에서의 메모리
- Customer vc = new VIPCustomer(); 에서 참조변수 vc가 가리키는 것은?
- VIPCustomer() 생성자의 호출로 인스턴스는 모두 생성 되었지만, 타입이 Customer 이므로 접근 할 수 있는 변수나 메서드는 Customer의 변수와 메서드임.
'Java > Java 올인원 패키지' 카테고리의 다른 글
16. 다운캐스팅과 instanceof (Java) (0) | 2020.03.17 |
---|---|
14. 메서드 오버라이딩 (Java) (0) | 2020.03.17 |
12. ArrayList (Java) (0) | 2020.03.16 |
11. 객체 배열, 다차원 배열 (Java) (0) | 2020.03.15 |
10 . 배열이란? (Java) (0) | 2020.03.15 |
- chapter8
- 20200429
- 20200504
- 20200427
- 20200503
- 20200420
- 20200330
- 20200502
- 20200417
- 20200317
- 20200622
- 20200421
- 20200413
- 20200403
- 20200510
- 20200423
- 20200804
- 20200425
- 생활코딩리눅스
- 20200428
- likelion
- 20200319
- chapter7
- 20200624
- 20200424
- 20200415
- 20201204
- 20200406
- 20200512
- 백준
- Total
- Today
- Yesterday