25분 1초 질문있습니다.
7-3 예제에서 두 클래스 모두 생성자가 없고, init()을 호출하는 코드도 mian에서 없는데, 어떤 과정에서 부모 클래스에서 init()이 실행되는건가요 ?
답변 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()메서드가 실행된다면, 그 실행 과정을 추적할 필요가 있습니다. 자식 클래스가 부모 클래스의 메서드를 호출하는지, 혹은 다른 방식으로 호출되는지 코드를 통해 확인이 필요합니다.
관련 정보를 참고할 수 있는 Q&A
아래의 링크는 생성자와 메서드 호출에 대한 추가적인 정보를 제공합니다:
- 생성자 생성시 질문있어요: 생성자 호출과 메서드 호출에 대한 상세한 설명이 있는 게시물입니다.
질문하신 코드에서 init() 호출이 명시되지 않았다면, 해당 메서드가 호출되는 부분이나 동작 과정을 다시 확인해 보시는 것이 좋을 것 같습니다. 코드를 더 명확히 이해하는 데 도움이 될 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
55강 파이썬에만있는 연산자들
0
1
1
55강의 파이썬에서만 있는 연산자들
0
2
1
29강 5:00
0
32
2
띄어쓰기
0
35
2
공부 순서
1
44
2
재귀함수 연산법
0
33
2
26년 1회차 기출 강의
0
63
2
기출문제
0
64
1
C언어에서
0
64
1
포인터 질문
0
58
2
실기 공부 시작 하려고 하는데요
0
109
2
필기자료 사라졌나요?(실기 일주일만에 안돼서 재도전-_-)
0
98
2
26년 1회 실기 해설 강의
0
116
2
53번 4-1 자료 오류 있는 것 같습니다.
0
109
2
7번문제
0
88
2
C언어 변형문제 9번문제 Pdf 수정요청
0
82
2
메서드 오버드라드
0
73
2
실수
0
64
1
공부 우선순위 우선강의 알려주세요
0
149
1
생성자 호출순서 강의 10번 문제 30분대 질문입니다
0
72
2
25년 2회 기출 5:40 질문입니다.
0
55
2
모의고사1회 3번 파이썬문제
0
86
2
C언어 출제변형 6번 문제
0
56
2
c언어 출제변형 강의 질문
0
45
2





