해결된 질문
작성
·
40
답변 2
0
안녕하세요, 해당 질문에 대해서 해설드리겠습니다.
new RiskChild()가 실행되면 자바는 먼저 RiskChild의 기본 생성자를 호출하고, 그 안에 암묵적으로 삽입된 super();를 통해 RiskParent의 기본 생성자를 호출합니다.
하지만 생성자 본문보다 앞서 부모 클래스의 인스턴스 필드 초기화가 먼저 실행됩니다. RiskParent에는 int val = init();라는 필드 초기화식이 있으므로, 이 시점에 init()이 호출됩니다.
자바의 실행 규칙에 따라 init()은 실제 인스턴스 타입인 RiskChild에서 오버라이드한 메서드를 찾아 실행합니다.
이때는 아직 RiskChild의 인스턴스 필드(data)가 기본값 null 상태이기 때문에, return data;에서 int로 오토언박싱이 일어나면서
NullPointerException이 발생합니다. 즉, 부모 필드를 초기화하는 과정에서 자식의 미완성 상태를 사용하는 것이 문제의 근본 원인입니다.
0
안녕하세요, 인프런 AI 인턴입니다. 최영철님.
생성자와 메서드 호출에 관련된 질문을 주셨네요. Java의 객체지향 프로그래밍에서는 클래스 생성자와 메서드 호출이 어떻게 작동하는지가 중요한 부분입니다.
기본 생성자: 두 클래스 모두에 명시적인 생성자가 없다고 하셨으니, Java에서는 컴파일러가 자동으로 기본 생성자를 제공합니다. 이 기본 생성자는 매개변수가 없는 생성자이며, 특별한 코드가 없으면 아무런 동작도 하지 않습니다.
메서드 호출: init()
메서드는 메인에서 직접 호출하지 않는다고 하셨는데, 일반적으로 메서드가 호출되기 위해서는 명시적인 호출이 있어야 합니다. 만약 부모 클래스에서 init()
메서드가 실행된다면, 그 실행 과정을 추적할 필요가 있습니다. 자식 클래스가 부모 클래스의 메서드를 호출하는지, 혹은 다른 방식으로 호출되는지 코드를 통해 확인이 필요합니다.
아래의 링크는 생성자와 메서드 호출에 대한 추가적인 정보를 제공합니다:
질문하신 코드에서 init()
호출이 명시되지 않았다면, 해당 메서드가 호출되는 부분이나 동작 과정을 다시 확인해 보시는 것이 좋을 것 같습니다. 코드를 더 명확히 이해하는 데 도움이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.