해결된 질문
작성
·
341
0
안녕하세요 영한님. 자바를 복습하고 있는 학생입니다.
이번 파트 정말 이해가 잘 되게 설명해주셔서 내용을 이해하는데는 어려움이 없었는데 기존에 알고 있던 지식때문인지 혼동되는 부분이 있어 질문드립니다.
기존에 알고 있는 지식은 자식 인스턴스 생성시 '부모의 필드 값과 가상 메서드 테이블 등의 메타 정보를 포함하는 하나의 인스턴스 생성'이었습니다.
그런데 이번 강의 내용에선 '외부에서 볼때는 하나의 인스턴스를 생성하는 것 같지만 내부에서는 부모와 자식 모두 생성되고 공간도 구분'이라고 하셨습니다. 그렇다면 이 문장을 '부모부터 자식 클래스까지의 모든 인스턴스를 생성'이라고 봐야하나요? 아니면 '부모부터 자식까지의 모든 메타 정보를 포함하는 하나의 인스턴스를 생성'이라고 봐야하나요?
뒤에서 배울 super()를 통해 자식 인스턴스 생성시 부모 생성자를 필수로 호출하므로 '모든 인스턴스'를 생성하는 것도 말이 될 거 같지만 만약 모든 인스턴스를 메모리에 생성한다면 메모리가 비효율적으로 사용되는 것도 같아 이 부분이 좀 헷갈립니다.
답변 1
2
안녕하세요. TH Kwon님
자바에서 상속을 사용할 때, 자식 클래스의 인스턴스를 생성하면 내부적으로는 부모 클래스의 인스턴스도 함께 생성됩니다. 이는 자식 클래스가 부모 클래스의 멤버(필드와 메서드)를 상속받기 때문입니다.
하지만 실제로 생성되는 객체는 자식 클래스의 인스턴스 하나입니다. 이 인스턴스 내부에는 부모 클래스의 멤버들이 포함되어 있습니다. 따라서 메모리 공간을 비효율적으로 사용하지 않습니다.
정리하면 다음과 같습니다:
자식 클래스의 인스턴스를 생성할 때, 부모 클래스의 인스턴스도 내부적으로 함께 생성됩니다.
하지만 실제로 메모리에 할당되는 객체는 자식 클래스의 인스턴스 하나입니다.
이 인스턴스에는 부모 클래스의 멤버(필드와 메서드)가 포함되어 있습니다.
따라서 "부모부터 자식까지의 모든 메타 정보를 포함하는 하나의 인스턴스를 생성"한다고 이해하시면 됩니다.
하지만 물리적으로 하나로 생성된다 할지라도, 뒤에서 설명할 다형성 개념을 이해하기 위해서 논리적으로는 분리해서 생성된다고 이해하는 것이 좋습니다.
super()
를 통해 부모 클래스의 생성자를 호출하는 것은 부모 클래스의 인스턴스를 초기화하기 위함입니다. 이는 상속 관계에서 객체를 올바르게 생성하고 초기화하는 데 필요한 과정입니다.
감사합니다.
답변 감사합니다! 스프링 강의에서 강조하셨던 추상과 구현의 구분처럼 논리적인 구조와 물리적인 구조 둘로 쪼개어 이해하니 더 잘 이해되네요.