생성자 멤버 데이터 초기화 순서에 대해서 _240726 추가.

보물창고·2024년 7월 7일
0
  • 240707

멤버 데이터 초기화 순서.

멤버 데이터 초기화 순서는 멤버 데이터 나열 순서다.

  • 전문가 p.407

코드

  • Foo 객체가 멤버 데이터 첫번째이기 때문에 먼저 초기화되어야 하지만, mvalue 값이 쓰레기값으로 들어오기 때문에 쓰레기값이 출력되는 것을 확인할 수 있다.

궁금증

: 어 저기 선언부에 mValue{4.2} 코드가 있는데 이거는 초기화되는 거아니냐??
했는 데 아니다...

클래스 선언쪽 멤버데이터 초기화에 대해서

  • 코드를 보면, 디폴트로 생성하고 있는데, 0으로 초기화되는 것이 아니라,
    멤버 데이터에 set한 값인 4.2로 초기화되는 것을 확인할 수 있다.

-> 디폴트 생성자만 존재할 경우만, 헤더에 초기화한 값이 적용이될까??
에 대해서. 어느 책에서도 자세히 설명하지 않았다... 240707

실험하기

1번. 이니셜라이저에서 멤버데이터의 값이 헤더값으로 설정되는 것이 아닌듯하다.
- 이니셜라이저리스트로 진입했는데, 헤더에 초기화한 값이 로드되지 않네??

2번. 이니셜라이저 리스트에서 mValue값 초기화 이후에 생성자 본문으로 넘어가지 않고, 헤더에 초기화한 부분으로 진입하는 것을 확인할 수 있다.

3번. 생성자 본문으로 진입한다.

4번. 결과

  • Object 생성자 진입시 생성자에서 이니셜라이저를 먼저 처리하는 건가?
    아니면, 멤버 데이터에 초기화한 값을 먼저 처리할 것인가에 대해서???

실험하기 2

: 아래의 코드를 디버깅해보면 이런식으로 초기화가 이루어진다.

  • 이니셜라이저에서 바로 a로 들어온다.
    그리고
  • 그리고 멤버 데이터 b로 진입하지 않고, 이니셜라이저에서 작성한 b로 가서 초기화를 한다.
  • 그 다음 c로 간다.

  • 마지막으로 이니셜라이저로 가서 d를 처리한다.

실험하기 3

  • 만약에 a의 값을 이니셜라이저에서 작성하면 멤버데이터에서 초기화를 하더라도
    멤버 데이터로 향하지 않는 결과의 코드이다.

실험하기 4

: 이니셜라이저에서 멤버데이터 순서를 뒤죽 박죽 했는데.
멤버 데이터 순서대로 초기화가 이루어지는 것을 확인할 수 있다.
그런데 c는 아직 a, b, 이후에 초기화가 이루어지므로 쓰레기값이다...

  • 다음

  • 다음

  • 다음

결론

: 선처리 영역에서 멤버데이터의 초기화가 이루어지는데, 법칙으로는 클래스의
멤버 데이터 순서대로 초기화가 이루어진다.

  • 심지어 이니셜라이저에서 멤버데이터 순서를 뒤죽박죽 하더라도 순서대로 진입하는 것을 확인할 수 있다.
  • 이니셜라이저에 멤버 데이터 초기화코드가 없으면, 선언부에서 초기화코드 있으면 , 그때서야 초기화가 이루어진다. 그런데 이니셜라이저에서 초기화코드가 있다면 해당 멤버 데이터 선언부로는 진입하지 않는다.
profile
🔥🔥🔥

0개의 댓글