java 클래스 생성 및 인스터변수 초기화 및 생성자 복합적인 질문

조회수 426회
class Base {

    int data = 5;


    Base() {

        System.out.println("Called Base()~");

    }

}

class Derived extends Base {

    int value = 4;


    Derived(){
        System.out.println("Called Derived()~");

    }

}



public class HelloJV {

    public static void main(String[] args) {
        Derived clsDerived = new Derived();
    }
}

큰 질문을 시작하기 앞서

"new class_name();"

구문이 동작하는 매커니즘을 2단계로 나누어 해석하면 1차적으로 new 연산자를 통해 class_name에 맞는 class 인스턴스를 메모리에 생성하고(생성한다는 것은 클래스의 모든 멤버들이 생성 된 다는걸 의미, 생성자 포함 )

2차적으로 new 연산자 뒤에 명시되어진 생성자를 찾아 호출한다 이렇게 2단계로 나누어 생각해도 될까요 ?

사고의 기반이 된 지식 근거 : 인스턴스 변수의 초기화 순서 : 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자 호출

위 코드의 진행 순서에 대한 사고의 흐름 :

  1. new 연산자에 의하여 Derived()라는 생성자를 통해 Derived형 객체 clsDerived를 생성

  2. clsDerived 객체가 생성되었으므로 int형 변수 value는 기본값 0으로 초기화 후, 명시적 초기화를 거쳐 4로 초기화된 후, 생성자가 호출되어야 한다고 생각했습니다. - 위에 제시한 근거에 의하여 ( 1차 궁금즘 )

디버깅을 통해 확인해보니 기본값 초기화(=0)는 이루어져있으나, 명시적 초기화(=4)는 되어있지 않은 상태로 생성자 호출이 되는걸 확인하였습니다. 무엇을 잘못 생각했는지 궁금합니다.

2번의 궁금증을 해결 못한채 쭉 이어가자면, 자식 클래스의 생성자가 호출이 되는 시점에 컴파일러에 의해 자동 삽입된 "super();"이라는 구문이 먼저 실행이 됩니다. 이때 궁금한 점은 2가지로 나뉩니다.

첫째, 자식 클래스가 생성되면 부모 클래스가 따라 생긴다는건 잘 알고 있습니다.

그리고 클래스를 생성하게 되면 "클래스의 생성과 그 클래스의 생성자 호출"은 동반된다고 생각이 듭니다.

이러한걸 기반으로 생각하게되면 "super();"을 호출하기 위해서는 1차적으로 부모 클래스가 메모리상에 생성되어있어야된다고

생각하는데, 그러면 앞에 말씀드렸듯이 "생성과 동시에 생성자가 호출"이 됬을 것 같은데, 굳이 super();이 삽입되는 이유가 뭔가요 ?,

생성은 미리해두고 "super();"을 뒤늦게 호출하는 구조라고 하여도, 그러면 int형 data라는 변수가 기본값(=0) 초기화 후, 명시적 초기화(=5)는 이미 거쳐둔 상태여야될 것 같은데 디버깅을 해본 결과 super()을 호출하였는데, 부모 클래스의 생성자가 바로 호출이 되는게 아니라 부모 클래스의 인스터스 변수에 대한 명시적 초기화를 진행하더라구요. 이건 위에 말한 순서를 거슬렀다가 다시 진행 되는거 아닌가요 ?

말로 하자니 제가 궁금한 부분이 잘 전달이 안되는 것 같기도하네요.

그리고 클래스를 생성하게 되면 동시에 멤버들이 메모리에 올라가고, 인스턴수 변수들이 기본값으로 초기화 되고, 명시적 초기화를 거친 후, 인스턴스 초기화 블록이 있으면 거친 후, 생성시 지정된 생성자를 마지막으로 호출하여 내부 초기화를 거치는게 맞나요 ?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)