[Java] 상속(inheritance)

SeongWon Oh·2021년 8월 15일
0

Java

목록 보기
14/39
post-thumbnail

Class상속

  • 상속 기능을 사용하면 이미 구현되어있는 class를 이용하여 속성이나 기능들을 확장하여 새로운 class를 만들 수 있다.

  • 기존 클래스보다 더 구체적이고 새로운 기능을 가진 클래스를 구현해야할 때 상속을 한다.

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

  • class B extends A {}
    위의 코드를 통해 class상속을 하는데 A의 위치에는 단 하나의 클래스만 올 수 있다.
    ※ Java는 단일 상속만을 지원한다.

👨🏻‍💻 Example Code

Customer클래스를 상속받아 생성한 VIPCustomer 예시

Customer.java

package ch03;

public class Customer {
	protected int customerId;
	protected String customerName;
	protected String customerGrade;
	//protected는 하위 class는 접근 가능하나 그 외에는 접근하지 못하는 것.
	int bonusPoint;
	double bonusRatio;
	
	public Customer() {
		customerGrade = "SILVER";
		bonusRatio = 0.01;
		
		System.out.println("Customer() called");
	}
	
	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;
	}
}
  • protected접근 제어자: protected는 하위 class는 접근 가능하나 그 외에는 접근하지 못하는 제어자이다.
  • private 멤버 변수였으면 하위 클래스에서도 접근이 불가하다.

VIPCustomer.java

package ch03;

public class VIPCustomer extends Customer{
	
	private String agentId;
	double saleRatio;
	
	public VIPCustomer() {
		customerGrade = "VIP";
		bonusRatio = 0.05;
		saleRatio = 0.1;
		
		System.out.println("VIP Customer() called");
	}
	public String getAgentId() {
		return agentId;
	}
}

CustomerTest.java

package ch03;

public class CustomerTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Customer customer1 = new Customer();
		customer1.setCustomerName("이순신");
		customer1.setCustomerId(10010);
		customer1.bonusPoint = 1000;
		System.out.println(customer1.showCustomerInfo());
		
		VIPCustomer customer2 = new VIPCustomer();
		customer2.setCustomerName("김유신");
		customer2.setCustomerId(10020);
		customer2.bonusPoint = 10000;
		System.out.println(customer2.showCustomerInfo());
	}
}

하위 class (child class)

  • 하위 class를 생성한다면 상위 클래스가 먼저 생성된다. 위의 예제의 경우 new VIPCustomer()을 호출하면 Customer()가 먼저 호출된다.

  • 하위 class는 super키워드를 통하여 상위 클래스에 대해 참조값을 얻으며 super를 통해 상위 클래스의 매서드나 멤버 변수에 접근한다.

  • super()는 상위 클래스의 기본 생성자를 호출하며 하위클래스에서 상위클래스를 따로 호출하지 않는다면 자동으로 super()이 호출된다. (상위 클래스의 기본 생성자가 반드시 존재해야한다.)

  • 상위 클래스의 기본 생성자가 없고 다른 생성자가 있는 경우 하위 클래스에서는 super를 이용하여 직접 상위 클래스의 생성자를 호출해야한다.

Customer.java

	public Customer(int customerID, String customerName) {
		this.customerID = customerID;
		this.customerName = customerName;
	}

VIPCustomer.java

// super를 이용하여 상위 클래스의 생성자 명시적으로 호출
	public VIPCustomer(int customerID, String customerName) {
		super(customerID, customerName);
	}

형 변환 (Upcasting)

  • 하위 클래스를 생성하면 상위 클래스도 생성됨으로 하위 클래스는 상위 클래스의 타입을 모두 내포하고 있어서 형 변환이 가능하다.

  • 상속 관계에 있어서 모든 하위 클래스는 상위 클래스로 형변환이 되며 반대로는 성립하지 않는다.

👨🏻‍💻 Example Code

Customer customerLee = new VIPCustomer();

VIPCustomer()생성자에 의해 VIPCustomer 클래스의 모든 멤버변수에 대한 메모리는 생성한다.
하지만 변수의 타입을 Customer로 형변환을 하여 만들었다.
이러한 경우 Customer의 변수와 매서드만 접근 가능하다.

VIPCustomer vCustomer = new VIPCustomer();
addCustomer(vCustomer);
int addCustomer(Customer customer){}

VIPCustomer()의 생성자로 VIPCustomer의 타입으로 생성하였으나 VIPCustomer는 Customer도 포함하고 있기에 Customer를 매개변수로 하는 addCustomer 매서드에 대입이 가능하다.


Downcasting

  • Upcasting된 class를 다시 원래의 타입으로 형변환 하는 것을 의미한다.

  • Upcasting의 경우는 자동으로 됐으나 Downcasting의 경우는 명시적으로 해야한다.

  • Downcasting의 경우는 if문instanceof를 사용하여 해당 instance가 맞는지 확인 후 형 변환을 한다.

👨🏻‍💻 Example Code

	public void testDownCasting(ArrayList<Animal> list) {
		for (int i=0;i<list.size();i++) {
			Animal animal = list.get(i);
			
			if(animal instanceof Human) {
				Human human = (Human)animal;
				human.readBook();
			}
			else if( animal instanceof Tiger) {
				Tiger tiger = (Tiger)animal;
				tiger.hunting();
			}
			else if( animal instanceof Eagle) {
				Eagle eagle = (Eagle)animal;
				eagle.flying();
			}
			else {
				System.out.println("error");
			}

		}
		
	}



Reference

  • [Fast Campas] 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 Online.
profile
블로그 이전했습니다. -> https://seongwon.dev/

0개의 댓글