ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java ] 클래스 상속 및 상속을 사용하는 이유
    프로그래밍/Java 2022. 3. 20. 10:37
    반응형

    상속

    • 상속이란? 미리 정의된 내용을 하위 클래스에서 받아서 재정의 및 재사용하는 행위를 일컸는다.
    • JAVA에서 상속 클래스 하나당 한번씩만 상속이 가능하다. 여러번 상속받는 개념은 인터페이스에서 가능하다.
    • 상속에서 구현할 내용은 상위 클래스 속성을 private 을 사용하지 않고 같은 패키지나 하위 클래스에서 사용가능한protected를 사용한다.
    • 상위 클래스의 내용을 재정의 할 때는 super()로 정의 한 다음 작성하지 않는 경우 JVM에서 임의로 컴파일 한다.
    • 상속받는 하위 클래스에서 생성자는 기본적으로 묵시적 생성이 되지만, 변화가 있을 경우 명시적으로 표현해 주어야한다.

     

    고객관리 프로그램 예제

    상품을 파는 쇼핑몰에서 Customer라는 객체가 있고 이는 일반 고객이다. 
    Customer라는객체를 상속받아 더 높은 등급의 고객인 
    VIPCustomer, GoldCustomer라는 객체를 생성하고 
    할인율과 포인트 제공율을 다른게 설정해 보세요.

     

    //Customer.java
    public class Customer {
    	//하위 패키지나 클래스에서 사용가능하도록 속성은 Protected를 사용한다.
    	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 + "입니다.";
    	}
      
            getter, setter~~~
    }

    클래스 다이어그램에서 그린 그림 처럼 Customer에 공통적으로 사용할 내용을 정의 하고 상속받는 객체들에서 임의로 정의해서 사용할 내용은 각자 작성한다.

    public class VIPCustomer extends Customer {
    
            //위에 상속받은 내용이 있기 때문에 	
            //*customerID, customerName, customerGrade*/이라는 내용은 작성하지 않는다.
            //추가하고 싶은 부분만 작성한다.
    	double salesRatio;
    	private String agentID;
    	
    	public VIPCustomer() 
    	{
    		customerGrade = "VIP";	//등급 VIP로 설정
    		bonusRatio = 0.05;		//적립금 5퍼 적용
    		salesRatio = 0.1;		//상품 구매시 10퍼 할일율 적용 
    	}
    
      getter, setter~~~
    }
    public class GoldCustomer extends Customer{
    	double salesRatio;
    	private String agentID;
    	
    	public GoldCustomer() 
    	{
    		customerGrade = "GOLD";
    		bonusRatio =  0.1;
    		salesRatio = 0.2;
    	}
    }

    필드들 정의하기

    • customer를 구체화하기 위해서 상속을 받아서 사용하기 때문에 위 클래스에서만 사용가능 하도록 protected를 사용하여 처리 한다.
    • 상속받은 내용이 있기 때문에 'customerID, customerName, customerGrade'이라는 내용은 작성하지 않는다.
    • 추가하고 싶은 부분만 작성한다
    //Customer 필드들
    protected int customerID;
    protected String customerName;
    protected String customerGrade;
    int bonusPoint;
    double bonusRatio;
    
    //VIPCustomer 필드들
    double salesRatio;
    private String agentID;

    생성자 정의하기

    • 생성자에서 필요한 내용만 재정의 하여 사용한다.
    • 등급과 할인율 적립금이 등급별로 다르기 때문에 재정의 한 모습이다.
    public Customer() 
    {
      customerGrade = "SILVER";
      bonusRatio = 0.01;
    }
    
    public VIPCustomer() 
    {
      customerGrade = "VIP"; //등급 VIP로 설정
      bonusRatio = 0.05;     //적립금 5퍼 적용
      salesRatio = 0.1;	 //상품 구매시 10퍼 할일율 적용 
    }

    생성자가 동일하지 않는 경우 Super()사용하기

    • 생성자를 동일하게 맞춰주지 않고 다르게 만들었을 경우 오류가 나게 되는데 이런 경우 명시적으로 재정의 하여 형식을 맞춰 주어야한다.
    //형식을 갖춘 생성자로 정의 한 경우 
    public Customer(int customerID, String customerName) 
    {
      this.customerID = customerID;
      this.customerName = customerName;
    
      customerGrade = "SILVER";
      bonusRatio = 0.01;
    }
    ---------------------------------------------------------------------------------------
    //아래와 같이 작성하면 상속관계에 맞지 않아 오류가 발생한다. 형식을 맞춰주어야한다.
    public VIPCustomer() 
    {
      customerGrade = "VIP";	//등급 VIP로 설정
      bonusRatio = 0.05;		//적립금 5퍼 적용
      salesRatio = 0.1;		//상품 구매시 10퍼 할일율 적용
    }
    
    //변수가 있는 생성자를 활용하기 위해서는 super()라는 상위 생성자 함수를 호출 해주어사용한다.
    public VIPCustomer(int customerID, String customerName) 
    {
      super(customerID, customerName); <<<<<----- 이부분을 꼭 작성하여 형식을 맞춰주어야 사용 가능하다.
      customerGrade = "VIP";
      bonusRatio =  0.05;
      salesRatio = 0.1;
    }

    상속 관계 객체 생성 주기

    • Customer를 상속받아 사용하는 VIPCustomer는 생성주기가 Cutomer를 생성한 후 VIPCustomer를 생성해주는 순서로 작동한다.
    • 2번 3번 상속을 받아 사용하는 경우도 Customer-GoldCustomer-VIPCustomer 이렇게 되어도 마찬가지로 상속받은 순서대로 생성이 순차 적용된다.
    public Customer() 
    {
      System.out.println("Customer() Call");
    }
    
    public VIPCustomer() 
    {
      System.out.println("VIPCustomer() Call");
    }
    
    //위와 같이 표현 해주었다면. 호출 되는 순서가 생성주기이다.
    ------------------------------------------------------------
    
    
    //main.java에서 print실행 한 결과
    VIPCustomer customerKim = new VIPCustomer();
    customerKim.setCustomerName("김유신");
    //출력
    //Customer() Call
    //VIPCustomer() Call

     

    반응형

    댓글

Designed by Tistory.