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() 메소드가 있다면 호출한다.
💡
electricaCar.move() 호출 시 Car 부모 타입에서도 move() 가 없는 경우 Car 타입의 부모 타입이 있다면, 호출한 메소드를 찾게한다.

메소드가 없는 경우 컴파일 오류가 발생한다.

요약

  • 상속 관계인 객체 생성 시, 부모와 자식 모두 생성함
  • 상속 관계의 객체 호출 시, 부모 자식 중 대상 타입을 정함. 호출자의 타입과 일치하는 타입을 선택
  • 현재 타입의 기능을 못찾으면 부모 타입으로 올라가 기능을 찾아서 수행. 기능이 없다면 컴파일 오류