일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- GROUP BY
- 상속
- 모달창 여러개
- SUB Query
- order by
- Servlet 맵핑
- 싱클톤패턴
- 다중 모달창
- 오라클 비교연산자
- 추상 메서드
- 형변환
- 스프링 모달창
- 템플릿
- static메서드
- 다운캐스팅
- react
- downcasting
- 사용자 데이터그램 프로토콜
- static
- AOP란?
- IP
- 리스트 모달창
- Java
- singleton
- static 예제
- 객체협력
- oracle 연동
- spring annotation
- 깃 명령어
- 이클립스 오라클 연동
- Today
- Total
모든지 기록하자!
[Java] 상속 - 오버라이딩(overriding) , 형 변환 (예제 : 고객관리) 본문
상위 클래스 메서드 재정의하기
VIP 고객에게 제공하는 할인율과 세일 가격을 적용하자
Customer에 calcPrice() 메서드가 이미 정의되어 있다. VIP 고객은 정가에서 10% 할인받을 수 있기 때문에 그대로 calcPrice()를 사용하지 못한다. 이렇게 상위 클래스에서 정의한 메서드가 하위 클래스에서
구현할 내용과 맞지 않을 경우에 하위 클래스에서 메서드를 재정의 할 수 있다.
이를 메서드 오버 라이딩(overriding)이라고 한다. 오버 라이딩을 하려면 반환형, 메서드 이름,
매개변수 개수, 매개변수 자료형이 반드시 같아야 한다. 그렇지 않으면 컴파일러는 재정의한 메서드를
기존 메서드와 다른 메서드로 인식한다.
public class VIPCustomer extends Customer{
private int agentID;
private double saleRatio;
...(생략)
@Override
public int calcPrice(int price) {
bonusPoint += price * bonusRatio; // 보너스 포인트 적립
return price - (int)(price * saleRatio); // 할인된 가격을 계산하여 반환
}
...(생략)
상위 클래스의 메서드를 재정의 할 때는 직접 써도 되고, 이클립스의 기능을 활용할 수도 있다.
(본인은 항상 이클립스 기능을 사용한다...)
코드에서 오른쪽마우스 -> [Source] -> [Override/Implement Method... ]를 누르면
상위 클래스 Customer의 메서드 중 재정의할 메서드를 선택할 수 있다.
calcPrice(int)를 선택하고 OK 누르면 VIPCustomer에 아래와 같이 자동으로 생성된다.
@Override
public int calcPrice(int price) {
return super.calcPrice(price);
}
@Override 에너테이션은 '재정의된 메서드'라고 컴파일러에 명확히 알려주는 역할을 한다.
에너테이션(Annotation)이란?
영어로는 주석이라는 의미이다. 자바에서 제공하는 에너테이션은 컴파일러에게 정보제공을 한다.
@Override는 메서드의 선언부가 다르다면 컴파일 오류가 발생하여 프로그래머의 실수를 막아준다.
미리 정의되어 있는 에너테이션을 표준 에너테이션이라고 한다.
주로 사용하는 에너테이션
에너테이션 | 설명 |
@Override | 재정의된 메서드라는 정보 제공 |
@FunctionalInterface | 함수형 인터페이스라는 정보 제공 |
@Deprecated | 이후 버전에서 사용되지 않을 수 있는 변수, 메서드에 사용됨 |
@SuppressWarnings | 특정 경고가 나타나지 않도록 함 |
VIPCustomer의 calcPrice()를 재정의 했으니 두 고객을 생성해서 지불하는 가격을 출력해보자
그리고 형 변환으로 VIPCustomer를 Customer형으로 변환시켰다. 이에 대한 결과는 어떻게 나올까?
public class OverridingTest1 {
public static void main(String[] args) {
Customer customerLee = new Customer(1010, "이병헌");
customerLee.bonusPoint = 5000;
VIPCustomer customerChoi = new VIPCustomer(1020, "최민식", 7777);
customerChoi.bonusPoint = 10000;
// VIPCustomer 인스턴스를 Customer형으로 변환시켰다.
Customer customerHa = new VIPCustomer(100010, "하정우",100);
customerHa.bonusPoint = 3000;
int price = 10000;
System.out.println(customerLee.getCustomerName()+"님이 지불해야 하는 금액은 "+
customerLee.calcPrice(price)+"원 입니다.");
System.out.println(customerChoi.getCustomerName()+"님이 지불해야 하는 금액은 "+
customerChoi.calcPrice(price)+"원 입니다.");
// customerChoi는 VIPCustomer로 생성했기 때문에
// VIPcustomer에 재정의된 calcPrice()를 호출한다.
System.out.println(customerHa.getCustomerName()+"님이 지불해야 하는 금액은 "+
customerHa.calcPrice(price)+"원 입니다.");
}
}
출력 결과
이병헌 고객은 일반 등급이라 정가 10000원을 그대로 지불한다.
최민식 고객은 VIP 등급 이므로 10% 할인을 받아 9000원을 지불했다.
하정우 고객도 VIP 등급으로 호출된 것을 확인할 수 있다. 아래에서 이유를 알아보자
멤버 변수와 메서드는 선언한 클래스형에 따라 호출된다. 그러면 customerHa.calcPrice(price)는
선언한 클래스형인 Customer 클래스의 calcPrice() 메서드를 호출해야 하지만 VIPCustomer클래스의
calcPrice() 메서드를 호출했다. 상속에서 상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때
호출되는 메서드는 인스턴스에 따라 결정된다. 이렇게 인스턴스 메서드가 호출되는 기술을
'가상 메서드'라고 한다.
가상 메서드
자바의 클래스는 멤버 변수와 메서드로 이루어져 있다. 클래스를 생성하여 인스턴스가 만들어지면
멤버 변수는 힙 메모리에 위치한다. 변수는 인스턴스가 생성될 때마다 새로 생성되지만 메서드는
실행해야 할 명령 집합이기 때문에 인스턴스가 달라도 같은 로직을 수행한다.
같은 객체의 인스턴스를 여러 개 생성해도 메서드도 여러 개가 생성되지 않는다.
재정의된 메서드는 실제 인스턴스에 해당하는 메서드가 호출된다.
재정의되지 않은 메서드는 주소가 같으면 상위 클래스의 메서드가 호출된다.
자바의 모든 메서드는 가상 메서드다.
'Java' 카테고리의 다른 글
[Java] 다운 캐스팅과 instanceof (0) | 2021.05.18 |
---|---|
[Java] 다형성 ( Polymorphism) (예제: 고객관리) (0) | 2021.05.17 |
[Java] 상속 - 형 변환, super, 생성자 (예제: 고객관리) (0) | 2021.05.15 |
[Java] 상속 (예제 : 고객관리) (0) | 2021.05.14 |
[Java] Array List 클래스 (0) | 2021.05.14 |