Java 상속 - 메모리 구조
상속 관계로 객체를 생성 시 메모리 구조를 살펴본다.

그림은 예제 코드에 사용한 객체의 상속 관계이다.
ElectricCar 객체 생성
new ElectricCar()
를 호출하면 ElectricCar
클래스만 갖고 오는 것이 아니라 Car
클래스를 포함하여 객체 인스턴스를 생성한다.
ElectricCar electricCar = new ElectricCar();

electricCar 변수 참조는 x0001 주소 값이고, 실제 Car, ElectricCar 두가지 클래스가 공존하고 있는 것을 볼 수 있다.
상속 관계의 필드와 메소드만 가져오는 것이 아닌 부모 클래스와 함께 생성한 셈이다.
외부에서는 인스턴스 하나로 가리키지만, 내부 클래스 입장으로 바라볼 때 Car, ElectricCar 공간으로 분간하고 있다.
electricCar.charge() 호출

electricCar.charge() 메소드를 호출하면 x0001 실제 메모리 주소를 찾아서 charge() 호출한다. 인스턴스 내부에는 상속 관계로 부모, 자식 클래스가 각각 있다. 메소드를 호출할 때 Car 클래스와 ElectricCar 클래스 둘 중 어느 것을 먼저 메소드를 살펴봐야 할지 선택해야 한다.
선택 기준은 호출하고 있는 electricCar 변수 타입에 따라서 정해진다.
electricCar 타입은 ElectricCar 클래스 타입으로 인스턴스 내부에는 같은 클래스를 먼저 살펴보고 charge() 메소드를 호출한다.
electricCar.move() 호출

- electricCar 호출하면 x0001 참조로 이동한다.
- 인스턴스 내부는 Car, ElectricCar 둘 중 electricCar 타입인 ElectricCar 부터 메소드를 살펴본다.
- 자신의 타입인 ElectricCar 타입에서 move() 메소드가 없다. ElectricCar 부모 타입인 Car 클래스에서 move() 메소드를 찾는다.
- Car 클래스의 move() 메소드가 있다면 호출한다.
메소드가 없는 경우 컴파일 오류가 발생한다.
요약
- 상속 관계인 객체 생성 시, 부모와 자식 모두 생성함
- 상속 관계의 객체 호출 시, 부모 자식 중 대상 타입을 정함. 호출자의 타입과 일치하는 타입을 선택
- 현재 타입의 기능을 못찾으면 부모 타입으로 올라가 기능을 찾아서 수행. 기능이 없다면 컴파일 오류