java

상속과 메모리 구조

주다애 2023. 12. 21. 22:43

Guitar 클래스가 Instrument 클래스를 상속받는 상황을 가정해보자.

public class Instrument {
    public void play() {
        System.out.println("악기를 연주합니다.");
    }
}

public class Guitar extends Instrument {
    @Override
    public void play() {
        System.out.println("기타를 연주합니다!");
    }
}

그리고 Guitar 객체를 생성한다.

public class InheritanceMain {
    public static void main(String[] args) {
        Guitar guitar = new Guitar();
        guitar.play();
    }
}

이 때 Guitar 객체가 참조하는 메모리에는 어떤 클래스가 올라와 있을까?

메모리에는 Instrument와 Guitar 이 두 클래스의 정보가 모두 올라와있다.

⭐ 즉, 상속을 하면 부모 클래스도 함께 생성되는 것이다. 겉으로 볼 때는 Guitar 하나의 객체가 생성되는 것 같지만 그 속을 보면 부모와 자식이 모두 생성된다.

 

현재는 guitar 객체의 타입이 Guitar여서 play()메소드를 호출하면 Guitar 클래스의 play()메소드가 호출된다.

(상속 관계에서는 호출자의 타입을 통해 대상 타입을 찾는다)

그런데 만약 Guitar 클래스에 play()메소드가 없으면 어떨까?

→ 부모 클래스(Instument)로 올라가서 호출한 메소드(play())를 찾는다. 부모 클래스에도 호출하는 메소드가 없으면 컴파일 오류가 발생한다.

 

정리하자면,

1. new 키워드를 통해 Guitar 객체를 생성하기 위한 메모리 공간이 힙 영역 에 할당된다.
2. 해당 메모리 공간에 Instrument 클래스의 인스턴스 변수가 할당되며 메소드는 메소드 영역 에 할당된다.
3. Guitar 객체가 생성되면(guitar) 객체의 참조값(x001)이 guitar 참조 변수에 저장되고 그 변수는 스택 영역 에 할당된다.
4. guitar.paly()가 호출되면 JVM은 guitar 참조 변수(x001)가 가리키는 메모리 주소(guitar 객체)를 찾아간다.
5. 그리고 Guitar 클래스에 정의된 play() 메소드를 실행한다.(동적 바인딩)

'java' 카테고리의 다른 글

인터페이스 vs 추상클래스  (0) 2024.05.16
자바 main 메소드는 왜 static일까?  (0) 2023.12.19
자바 메모리 구조  (0) 2023.12.16
final 키워드(변수, 상수)  (0) 2023.12.14
생성자  (0) 2023.12.12