상속에서 상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 인스턴스에 따라 결정된다.
선언한 클래스형이 아닌 생성된 인스턴스의 메서드를 호출하는 것.
인스턴스의 메서드가 호출되는 기술을 '가상 메서드(virtual method)'라고 한다.
가상메서드
자바의 클래스는 필드(멤버변수)와 메서드(멤버 함수)로 이루어져 있다.
클래스를 생성하여 인스턴스가 만들어지면 필드(멤버 변수)는 힙 메모리에 위치한다.
변수가 사용하는 메모리와 메서드가 사용하는 메모리는 다르다.
변수는 인스턴스가 생성될 때마다 새로 생성되지만, 메서드는 실행해야 할 명령 집합이기 때문에 인스턴스가 달라도 같은 로직을 수행해야 한다.
같은 객체의 인스턴스를 여러 개 생성한다고 해서 메소드도 여러개 생성되지 않는다.
public class TestA {
//필드(멤버 변수)를 정의
int num;
//메서드(멤버 함수)를 정의
void aaa() {
System.out.println("aaa() 출력합니다.");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestA a1 = new TestA();
a1.aaa();
TestA a2 = new TestA();
a2.aaa();
}
}
당연히 같은 결과 값을 가져온다. 이를 그림으로 도식화 해보면 메서드는 메모리에 따로 올라가는 것이 아니기 때문에 같은 메서드를 불러오는 것을 확인 할 수 있다.
| 재정의한 메서드를 불러우는 경우
/*[실습] 클래스 형에 기반하여 지불금액을 계산하시오.*/
package inheritanceTest;
public class OverridingTest3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int price = 10000;
//Customer 인스턴스 생성
Customer customerA = new Customer(10010,"라이언");
System.out.println(customerA.getCustomerName()+"님이 지불해야하는 금액은"+
customerA.calcPrice(price)+"원 입니다.");
//VIPcustomer 인스턴스 생성
VIPcustomer customerB = new VIPcustomer(10020,"무지",12345);
System.out.println(customerB.getCustomerName()+"님이 지불해야하는 금액은"+
customerB.calcPrice(price)+"원 입니다.");
//VIPcustomer 인스턴스를 Customer 형으로 변환한다 -> 업캐스팅
Customer vc = new VIPcustomer(10030,"나몰라",67890);
System.out.println(vc.getCustomerName()+"님이 지불해야하는 금액은"+vc.calcPrice(price)+"입니다.");
}
}
'공부 STUDY > JAVA' 카테고리의 다른 글
[JAVA] 인터페이스 (interface) (0) | 2023.01.15 |
---|---|
[JAVA] 예외처리 (Exception) -(1) (0) | 2023.01.14 |
[JAVA] 인터페이스(interface) (0) | 2023.01.10 |
[JAVA] 다운캐스팅 (DownCasting) (0) | 2023.01.09 |
[JAVA] ArrayList 사용법 (0) | 2023.01.09 |