제주 탈출 일지

패스트캠퍼스 챌린지 16일차 본문

패스트캠퍼스 챌린지!

패스트캠퍼스 챌린지 16일차

귀건 2021. 9. 21. 17:20
728x90
반응형

16일차 오늘은 즐거운 추석,,,

 

 3. 객체 지향 핵심

1. 객체 간의 상속은 어떤 의미일까?

상속을 한다는 것은 이미 구현된 다른 클래스의 기능을 확장하여 사용하기 위함이다.

 

클래스 다이어그램에서는 하위 클래스가 상위 클래스를 바라본다는 의미에서 화살표가

상위 클래스 <- 하위 클래스로 그려진다.

 

Java는 단일 상속만을 지원.

class B extends A { }

 

상속을 구현하는 경우

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

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

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

 

2. 상속을 활용한 멤버십 클래스 구현하기

멤버십 시나리오

회사에서 고객 정보를 활용한 맞춤 서비스를 하기 위해 일반고객(Customer)과

이보다 충성도가 높은 우수고객(VIPCustomer)에 따른 서비스를 제공하고자 함

물품을 구매 할 때 적용되는 할인율과 적립되는 보너스 포인트의 비율이 다름

여러 멤버십에 대한 각각 다양한 서비스를 제공할 수 있음.

멤버십에 대한 구현을 클래스 상속을 활용하여 구현해보기.

 

if-else가 너무 많아지면 상속을 고민할 여지가 있는것.

 

Customer 클래스

package ch02;

public class Customer {
	
	private int customerID;
	private 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 String getCustomerGrade() {
		return customerGrade;
	}


	public void setCustomerGrade(String customerGrade) {
		this.customerGrade = customerGrade;
	}


	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;
	}

	
	
}

 

VIPCustomer 클래스

package ch02;

public class VIPCustomer extends Customer {

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

	public String getAgentID() {
		return agentID;
	}

	public void setAgentID(String agentID) {
		this.agentID = agentID;
	}
	
	
}

CustomerTest 클래스

package ch02;

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());
	}

}

VIPCustomer 클래스에서 Customer 클래스를 상속받는다. 그래서 VIP클래스에서는 정의하지 않은 Customer의 getter/setter 메소드와 변수들을 사용할 수 있다.

 

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

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

하위 클래스의 생성자에 호출하는 코드가 없지만,

컴파일러가 자동으로 하위 클래스의 생성자에 자동으로 super(); 를 추가하여 상위 클래스의 생성자가 호출되는 것이다.

(this(); 하면 자기 자신의 생성자를 호출)

 

만약 super(); 했는데 상위 클래스에 생성자가 default 생성자가 아닌 명시적으로 호출해야 하는 생성자일 경우..

-> 바로 에러 발생.

그렇다면 명시적으로 super(0, "no-name"); 과 같이 호출하거나, 상위 클래스의 생성자가 필요로 하는 매개변수를 받는 생성자를 생성하면 된다.

 

기억해야 되는 점은 상위 클래스 -> 하위 클래스 순서로 생성자를 호출.

 

예제 결과 또한 Customer (int, String) (상위 클래스) -> VIPCustomer(int String) 순서로 호출된 것을 확인할 수 있었다.

private 멤버 변수 상속 또한 힙메모리에 상속받았을 때 만들어지지만, 접근은 하지 못한다.

 

형변환

VIPCustomer 의 인스턴스는 Customer에 형변환 될 수 있다. ( VIP는 Customer의 속성들을 모두 내포하고 있기 때문에)

하위 클래스 -> 상위 클래스로 형변환 (업 캐스팅)

상위 클래스 -> 하위 클래스 형변환 (다운 캐스팅)

 

예를 들어 Customer vc = new VIPCustomer(12345, "noname"); 라면,

인스턴스는 VIPCustomer의 속성을 모두 가지고 있지만,
변수 형이 Customer이기 때문에 VIPCustoemr의 변수나 메소드는 사용할 수 없다.

 

변수 계층이 여러개 여도 가장 하위 클래스는 상속받은 클래스들에 대한 속성들을 모두 가지고 있다.

 

 

오늘은 여기까지....

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

728x90
반응형
Comments