티스토리 뷰

Java/Java 올인원 패키지

13. 상속 (Java)

GrapeMilk 2020. 3. 16. 13:45

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
댓글