본문 바로가기

DEVELOPER/Java

객체 간의 상속

반응형

클래스 상속


· 새로운 클래스를 정의할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능을 확장하여 클래스를 구현

· 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현해야 할 때 기존 클래스를 상속

상속

상속하는 클래스 : 상위 클래스, parent class, base class, super class

상속받는 클래스 : 하위 클래스, child class, derived class, subclass

 

상속의 문법

class B extends A {

}

extends 키워드 뒤에는 단 하나의 클래스만 올 수 있음

자바는 단일 상속(single inheritance)만을 지원

 

상속을 구현하는 경우

① 상위 클래스는 하위 클래스보다 더 일반적인 개념과 기능을 가짐.

② 하위 클래스는 상위 클래스보다 더 구체적인 개념과 기능을 가짐.

③ 하위 클래스가 상위 클래스의 속성과 기능을 확장(extends) 한다는 의미.

extends의 경우

 

 

상속을 활용한 클래스 구현


멤버십 클래스 구현

 

Customer 구현


· Customer이라는 고객 모두가 적용되는 클래스를 구현한다.

· Customer의 속성으로는 ' 고객 아이디, 고객 이름, 고객 등급, 보너스 포인트, 보너스 포인트 적립비율 '

· Customer의 등급은 'SILVER'이고 물품 구매 시 1%의 보너스 포인트가 적립된다.

 

VIP Customer 구현


· VIP Customer의 속성은 Customer와 동일하다.

· VIP Customer의 등급은 'VIP'이고 물품 구매 시 5%의 보너스 포인트 적립, 10% 할인, 담당 상담원 존재

 


Customer 클래스

public class Customer {

	protected int customerID; //protected : 외부 클래스는 접근이 불가능 하지만 하위클래스는 접근 가능
	protected String customerName;
	protected String customerGrade;
	int bonusPoint;
	double bonusRatio;
	
	
	public Customer() {
		
		customerGrade = "SILVER";
		bonusRatio = 0.01; // 1%
	}
	
	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;
	}
}
    

 

VIP 클래스

public class VIPCustomer extends Customer {

	double salesRatio; // 할인율
	private int agentID; // 담당 상담원 ID
	
	public VIPCustomer() {
		
		customerGrade = "VIP";
		bonusRatio = 0.05;
		salesRatio = 0.1;
	}
	
	public int getAgentID() {
		
		return agentID;
	}
}

 

 


protected 접근 제어자

· 상위 클래스에 선언된 private 멤버 변수는 하위 클래스에서 접근할 수 없음

· protected는 외부 클래스는 접근할 수 없지만, 하위 클래스는 접근 가능

 

 

상속에서 클래스 생성 과정과 형 변환


하위 클래스가 생성 되는 과정

하위 클래스를 생성하면 상위 클래스가 먼저 생성

위 예제에서 new VIPCustomer( )를 호출하면 Customer( )가 먼저 호출

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

 

super 키워드

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

super( )는 상위 클래스의 기본 생성자를 호출

하위 클래스에서 명시적으로 상위 클래스의 생정자를 호출하지 않아도 super( )가 호출 됨

( 이때 반드시 상위 클래스의 기본(default) 생성자가 존재 해야 함)

super는 생성된 상위 클래스 인스턴스의 참조 값을 가지므로 super를 이용하여 상위 클래스의 메서드나 멤버 변수에 접근할 수 있음.


 

default 생성자가 아닐 때 super( )를 명시적으로 써주는 경우


Customer 클래스

public class Customer {

	protected int customerID; //protected : 외부 클래스는 접근이 불가능 하지만 하위클래스는 접근 가능
	protected String customerName;
	protected String customerGrade;
	int bonusPoint;
	double bonusRatio;
	
	
	public Customer(int customerID, String customerName) {
		
		this.customerID = customerID;
		this.customerName = customerName;
		
		customerGrade = "SILVER";
		bonusRatio = 0.01; // 1%
		
		System.out.println("Customer(int, String) 생성자 호출");
	}
		
}

 

VIPCustomer 클래스

public class VIPCustomer extends Customer {

	double salesRatio; // 할인율
	private int agentID; // 담당 상담원 ID
	
	public VIPCustomer(int customerID, String customerName) {
		
		super(customerID, customerName);
		
		customerGrade = "VIP";
		bonusRatio = 0.05;
		salesRatio = 0.1;
		
		System.out.println("VIPCustomer(int, String) 생성자 호출");
	}
	
	public int getAgentID() {
		
		return agentID;
	}
}

▲ 위와 같이 super을 사용하여 생성자를 형성 할 수 있다.


상속에서 인스턴스 메모리의 상태

· 항상 상위 클래스의 인스턴스가 먼저 생성되고, 하위 클래스의 인스턴스가 생성

 

형 변환 (업 캐스팅)

· 상위 클래스로 변수를 선언하고 하위 클래스의 생성자로 인스턴스를 생성

Customer customerLee = new VIPCustomer( );

· 상위 클래스 타입의 변수에 하위 클래스 변수가 대입

· 하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로의 묵시적 형 변환이 가능

· 상속 관예에서 모든 하위 클래스는 상위 클래스로 형 변환(업캐스팅)이 됨 < 그 역은 성립 X>

사람은 포유류이다 (O) , 포유류는 사람이다 (X)

 


Customer vc = new VIPCustomer(12345, "noname");
		
System.out.println(vc.showCustomerInfo());

업 캐스팅 후 instance를 생성해 보면 상태는 VIP이지만 vc는 Customer의 변수와 메서드만 이용이 가능하다.

업 캐스팅 생성자의 결과

 

 

반응형

'DEVELOPER > Java' 카테고리의 다른 글

다운 캐스팅과 instanceof  (0) 2021.04.26
오버라이딩(Overriding)  (0) 2021.04.25
객체 배열을 구현한 클래스 ArrayList  (0) 2021.04.23
2차원 배열  (0) 2021.04.23
객체 배열  (0) 2021.04.23