Java 상속

Codren·2021년 6월 1일
0
post-custom-banner

Section 1. 상속 (Inheritance)

1. 상속 (Inheritance)

새로운 클래스를 정의할 때 이미 구현된 클래스의 멤버 변수 또는 메서드를 그대로 물려받아 더 구체적인 기능을 가진 클래스를 구현하는 기법

  • 상속을 구현하는 경우
    - 상위 클래스가 하위 클래스 보다 더 일반적인 개념과 기능을 가질 때
    - 하위 클래스가 상위 클래스 보다 더 구체적인 개념과 기능을 가질 때




2. 상속 관계

  • 상속하는 클래스 : 상위 클래스 = parent class = base class = super class
  • 상속받는 클래스 : 하위 클래스 = child class = derived class = subclass




3. 상속 문법

  • extends 키워드 뒤에는 단 하나의 클래스만 올 수 있음 (자바는 단일 상속)
class B extends A{
	...	
    	...
}



Section 2. 상속의 클래스 생성 과정

1. 상위 클래스

  • 일반 고객 클래스
public class Customer {

	protected int customerID;		# 상속 받은 하위 클래스에서 접근 가능하도록
	protected String customerName;		# protected 지정
	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 + "입니다";
		
	}
    	... getter / setter 
}




2. 하위 클래스

  • VIP 고객 클래스
public class VIPCustomer extends Customer{

	private int agentID;		
	double salesRatio;
	
	public VIPCustomer() {
		customerGrade = "VIP";    
		bonusRatio = 0.05;
		salesRatio = 0.1;
	}
	
	public int getAgentID() {
		return agentID;
	}
}




3. 하위 클래스 생성 과정(원리)

  • 클래스를 상속 받는 경우 하위 클래스의 생성자에서는 반드시 상위 클래스의 생성자를 호출 함

        ① new VIPCustomer() 호출
        ② public VIPCustomer() 생성자 수행
        ③ super() 호출
        ④ public Customer() 수행 -> Customer 객체 생성
        ⑤ 다시 public VIPCustomer() 생성자로 돌아옴 -> VIPCustomer 객체 생성




4. super 키워드

하위 클래스에서 가지는 상위 클래스에 대한 참조 값

  • super 키워드를 이용해 상위 클래스의 메서드나 멤버 변수에 접근할 수 있음
  • super() 메서드는 상위 클래스의 기본 생성자를 호출 함
  • 하위 클래스에서 명시적으로 상위 클래스의 생성자를 호출하지 않으면 super()가 호출 됨
    (이 때 반드시 상위 클래스의 기본 생성자가 존재 해야 함)
  • 상위 클래스에 기본 생성자가 아닌 다른 생성자가 있는 경우 하위 클래스에서는 super 키워드를 이용하여 명시적으로 상위 클래스의 생성자를 호출해야 함




5. 상속의 메모리 구조

  • 항상 상위 클래스의 인스턴스가 먼저 생성되고, 하위 클래스의 인스턴스가 생성 됨
  • super.멤버 변수 = 하위 클래스의 멤버 변수




Section 3. 형변환

1. 형변환 (업캐스팅)

  • 상위 클래스로 변수를 선언하고 하위 클래스의 생성자로 인스턴스를 생성
  • 하위 클래스는 상위 클래스를 내포하고 있으므로 묵시적 형변환이 가능함
  • 상속 관계에서 모든 하위 클래스는 상위 클래스로 형변환(업캐스팅)이 가능 (역 성립 X)
Customer vc = new VIPCustomer();




2. 형변환 후 접근 가능 범위

  • 하위 클래스의 인스턴스가 모두 생성은 되지만 접근은 형변환 된 상위 클래스의 멤버만 가능




3. 형변환 (다운캐스팅)

  • 업캐스팅된 객체를 다시 원래의 타입으로 형변환
  • 하위 클래스로의 형변환은 명시적으로 해야 함
  • instanceof 를 이용해서 형변환 작업 전에 확인 가능
    - 원래 인스턴스의 형이 맞는지 여부를 체크하는 키워드 맞으면 true 아니면 false를 반환 함
if (vc instanceof VIPCustomer) {
	VIPCustomer vc = (VIPCustomer)vc;
}
post-custom-banner

0개의 댓글