-
[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로 이루어져있다. 이런게 선언은 같은 것으로 하였지만, 다양한 형태의 객체로 생성이 되는 것이 다형성이다. 그리고 그 안에 정의된 내용도 다 다른게 재정의 되어있기 때문에 할인율과 포인트 생성되는 것이 다 다른 형태를 띄게 된다 이것이 바로 다형성이라는 것이다. 다형성의 개념을 정확히 알아야 코딩할때 헷갈리지 않고 코딩을 할 수 있는것같다.
반응형'프로그래밍 > Java' 카테고리의 다른 글
[Java Interface] 인터페이스를 사용하는 이유 (0) 2022.03.20 [JAVA abstract]추상화 클래스 , 메서드 알아보기 (0) 2022.03.20 [Java ] 클래스 상속 및 상속을 사용하는 이유 (0) 2022.03.20 [Java 객체지향 입문 ] 객체간의 협력 (0) 2022.03.17 [Java] 객체지향언어 입문 (0) 2022.03.16