본문 바로가기
IT

[Do it! 자바 프로그래밍 입문] 08 상속과 다형성

by csongin 2022. 5. 31.
728x90
상속과 다형성
오버 라이딩과 다형성
다형성 활용과 다운 캐스팅

상속과 다형성

상속이란?

클래스를 정의할 때 이미 구현된 클래스를 상속(inheritance) 받아서 속성이나 기능이 확장되는 클래스를 구현하는 것

상위 클래스는 하위 클래스보다 일반적인 의미를 가짐

하위 클래스는 상위 클래스보다 구체적인 의미를 가짐

 

상속하는 클래스

상위 클래스, parent class, base class, super class

상속받는 클래스

하위 클래스, child class, derived class, subclass

// 클래스 상속 문법

class Mammal{ 

}

class Human extends Mamml{

}

/* 
extends 뒤에는 단 하나의 class만 사용할 수 있음
Java는 single inheritance만을 지원함
*/

상속을 활용한 고객관리 프로그램

고객의 정보를 활용하여 고객 맞춤 서비스를 구현

고객의 등급에 따라 차별화된 할인율과 포인트를 지

등급에 따른 클래스를 따로 구현하는 것이 아닌 일반적인 클래스를 먼저 구현하고 그보다 기능이 많은 클래스는 상속을 활용하여 구현함

 

Customer 클래스 메서드

public class Customer {
    
    private int customerID;
    private String customerName;
    private String customerGrade;
    int bonusPoint;
    double bonusRatio;
    
    public Customer() 
    {
        customerGrade = "SILVER";
        bonusRatio = 0.01;
    }
    // 기본 생성자 고객 한 명이 새로 생성되면 CustomerGrade는 SILVER이고, bonusRatio는 1%로 지정함
    
    public int calcPrice(int price){
        bonusPoint += price * bonusRatio;
        return price;
    }
    /* 
    제품에 대해 지불해야 하는 금액을 계산하여 반환함. 
    할인되지 않는 경우 가격을 그대로 반환, 가격에 대해 보너스 포인트 비율을 적용하여 보너스 포인트를 적립
    */
    
    public String showCustomerInfo(){
        return customerName + " 님의 등급은 " + customerGrade + "이며, 보너스 포인트는 " + bonusPoint + "입니다.";  
    }
    // 고객 정보를 출력, 고객 이름, 등급 현재 적립된 포인트 정보를 보여줌
}
// 새로운 고객 등급이 필요한 경우

public class VIPCustomer extends Customer{

    private int agentID;

    double saleRatio;
    
    public VIPCustomer() // 고객 등급 VIP, 보너스 포인트 5%, 제품 구매 할인율 10%
    {
        customerGrade = "VIP";
        bonusRatio = 0.05;
        saleRatio = 0.1;
    }
    
    public int getAgentID(){ // 담당 전문 상담원 배정
        return agentID;
    }
}

접근 제한자 가시성

  외부 클래스  하위 클래스 동일 패키지 내부 클래스
public O O O O
protected X O O O
default(선언되지 않음) X X O O
private X X X O

상속에서 클래스 생성 과정

하위 클래스가 생성될 때 상위 클래스가 먼저 생성됨

상위 클래스의 생성자가 호출되고 하위 클래스의 생성자가 호출됨

하위 클래스의 생성자에서는 무조건 상위 클래스의 생성자가 호출되어야 함

아무것도 없는 경우 컴파일러는 상위 클래스 기본 생성자를 호출하기 위한 super()를 코드에 넣어줌

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

만약 상위 클래스의 기본 생성자가 없는 경우 (매개변수가 있는 생성자만 존재하는 경우) 하위 클래스는 명시적으로 상위 클래스로 호출해야 함

 

상속에서의 메모리 상태

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

 

super 예약어

this 가 자기 자신의 인스턴스의 주소를 가지는 것처럼 super는 하위 클래스가 상위 클래스에 대한 주소를 가지게 됨

하위 클래스가 상위 클래스에 접근할 때 사용할 수 있음

 

상위 클래스로의 묵시적 형 변환(업 캐스팅)

상위 클래스 형으로 변수를 선언하고 하위 클래스 인스턴스를 생성할 수 있음

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

 

반응형