ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java Overriding] 오버라이딩과 다형성
    프로그래밍/Java 2022. 3. 20. 10:50
    반응형

    오버라이딩(Overridng)

    • 오버라이딩은 상속관계에서 하위 클래스가 상위 클래스의 함수를 재정의 하여 사용하고 싶을 때 사용한다.
    • 오버라이딩은 상속을 받은 객체에서 함수위에 @Override이라는 표시를 해주어야 하며, 상위 객체의 함수 명과 형식이 똑같아야 사용가능하다. 다른경우 다른 함수로 취급된다.
    • 상속관계에서 객체를 생성할 때 형변환 하여도 new에 적힌 객체의 함수가 호출이 된다.(가상 메서드 활용하기 때문)
    • 재정의 하지 않고 그냥 동일하게 사용하고 싶다면 super.함수()를 사용한다. 그런데 굳이 이렇게 사용하지 않는다.

    예제

    Customer라는 객체 클래스에서 CalcPrice라는 함수를 재정의 하여 사용해보자.

    public class Customer {
    	
    	protected int customerID;
    	protected String customerName;
    	protected String customerGrade;
    	int bonusPoint;
    	double bonusRatio;
    	
    	public Customer() 
    	{
    		customerGrade = "SILVER";
    		bonusRatio = 0.01;
    	}
    	
    	public Customer(int customerID, String customerName) 
    	{
    		this.customerID = customerID;
    		this.customerName = customerName;
    		
    		customerGrade = "SILVER";
    		bonusRatio = 0.01;
    	}
    	
    	public int calcPrice(int price)
    	{
    		bonusPoint += price * bonusRatio;
    		return price;
    	}
    	
    	public String showCustomerInfo()
    	{
    		return customerName + "님의 등급은 " + customerGrade + "이며, 보너스 포인트는" + bonusPoint + "입니다.";
    	}
    }
    public class VIPCustomer extends Customer {
    
    	double salesRatio;
    	private String agentID;
    	
    	public VIPCustomer() 
    	{
    		//super(); 를 컴파일러가 자동으로 넣어 준다.
    		//super는 Customer클래스 생성자를 의미 한다. 그래서 안에 속성값들과 함수들을 모두 사용할 수 있다.
    		customerGrade = "VIP";	//등급 VIP로 설정
    		bonusRatio = 0.05;		//적립금 5퍼 적용
    		salesRatio = 0.1;		//상품 구매시 10퍼 할일율 적용
    	}
    	
    	public VIPCustomer(int customerID, String customerName) 
    	{
    		//변수가 있는 생성자를 활용하기 위해서는 super()라는 상위 생성자 함수를 호출 해주어사용한다.
    		super(customerID, customerName);
    		customerGrade = "VIP";
    		bonusRatio =  0.05;
    		salesRatio = 0.1;
    	}
    
    	//override된 메서드 이름 형식은 모두 상위 클래스의 이름 형식과 같아야한다.
    	@Override
    	public int calcPrice(int price) {
    		bonusPoint += price * bonusRatio;
    		price -= (int)(price * salesRatio);
    		return price;
    		//아래와 같이 사용하면 상위 클래스 내용과 동일하게 작동한다.
    		//return super.calcPrice(price);
    	}
    }
    public class GoldCustomer extends Customer{
    	double salesRatio;
    	private String agentID;
    	
        public GoldCustomer() 
    	{
    		customerGrade = "GOLD";
    		bonusRatio =  0.1;
    		salesRatio = 0.2;
    	}
    	
        
    	public GoldCustomer(int customerID, String customerName) 
    	{
    		//변수가 있는 생성자를 활용하기 위해서는 super()라는 상위 생성자 함수를 호출 해주어사용한다.
    		super(customerID, customerName);
    		customerGrade = "GOLD";
    		bonusRatio =  0.1;
    		salesRatio = 0.2;
    	}
    	
    	//override된 메서드 이름 형식은 모두 상위 클래스의 이름 형식과 같아야한다.
    	@Override
    	public int calcPrice(int price) {
    		bonusPoint += price * bonusRatio;
    		price -= (int)(price * salesRatio);
    		return price;
    		//아래와 같이 사용하면 상위 클래스 내용과 동일하게 작동한다.
    		//return super.calcPrice(price);
    	}
    }

    위와 같이 작성한 코드를 보았는데, @Overrding을 이용하여 계산 방식을 재정의 해주었다. Customer에서는 할인율이 적용되지 않지만, Vip,Gold Customer에서는 할인율을 적용하는 내용을 기입하여 재정의 한다음 사용하게 만들었다. 이것을 출력해보면

    public class CustomerTest {
    
    	public static void main(String[] args) {
    
    		ArrayList<Customer> customerList = new ArrayList<>();
    		
    		Customer customerT = new Customer(10010,"Tomas");
    		Customer customerJ = new Customer(10010,"James");
    		Customer customerE = new GoldCustomer(10010,"Edward");
    		Customer customerP = new GoldCustomer(10010,"Percy");
    		Customer customerK = new VIPCustomer(10010,"Kim");
    		
    		customerList.add(customerT);
    		customerList.add(customerJ);
    		customerList.add(customerE);
    		customerList.add(customerP);
    		customerList.add(customerK);
    		
    		for(Customer customer: customerList) {
    			System.out.println(customer.showCustomerInfo());
    		}
    		
    		int price = 10000;
    		for(Customer customer: customerList) {
    			System.out.println(customer.calcPrice(price) + "," + customer.bonusPoint);
    		}
            	//출력
            	//Tomas님의 등급은 SILVER이며, 보너스 포인트는0입니다.
    		//James님의 등급은 SILVER이며, 보너스 포인트는0입니다.
    		//Edward님의 등급은 GOLD이며, 보너스 포인트는0입니다.
    		//Percy님의 등급은 GOLD이며, 보너스 포인트는0입니다.
    		//Kim님의 등급은 VIP이며, 보너스 포인트는0입니다.
    		//10000,100
    		//10000,100
    		//8000,1000
    		//8000,1000
    		//9000,500
    
    	}
    }

     10000원을 결제 한다고 가정했을 때 등급별로 지불금액이 일반 10000, VIP 9000, Gold 8000원 인것을 볼 수 있다. 여기서 알아봐야 할게 바로 다형성 이라는 것이다.

     

    다형성이란?

    다형성이란 같은 객체로 선언을 하여도 다양한 형태를 띄고, 똑같은 기능인데도 불구하고 다양한 결과값이 나온다는 것이다. 말이 어려운것같은데, 코드로 보면 이해가 갈것같다.

     

    //객체선언은 모두 Customer로 되어있지만 new에 해당하는 부분은 모두 다르게 지칭 되어져있다.
    Customer customerT = new Customer(10010,"Tomas");
    Customer customerJ = new Customer(10010,"James");
    Customer customerE = new GoldCustomer(10010,"Edward");
    Customer customerP = new GoldCustomer(10010,"Percy");
    Customer customerK = new VIPCustomer(10010,"Kim");

    맨앞에 선언부에는 Cusomer라고 선언을 하였지만 정작 생성객체는 New Customer. VIPCustomer, GoldCustomer로 이루어져있다. 이런게 선언은 같은 것으로 하였지만, 다양한 형태의 객체로 생성이 되는 것이 다형성이다. 그리고 그 안에 정의된 내용도 다 다른게 재정의 되어있기 때문에 할인율과 포인트 생성되는 것이 다 다른 형태를 띄게 된다 이것이 바로 다형성이라는 것이다. 다형성의 개념을 정확히 알아야 코딩할때 헷갈리지 않고 코딩을 할 수 있는것같다.

    반응형

    댓글

Designed by Tistory.