인프런 커뮤니티 질문&답변

wechi님의 프로필 이미지
wechi

작성한 질문수

김영한의 실전 자바 - 기본편

this 생성자를 꼭 첫줄에만 넣어야만 하는 이유가 있나요?

작성

·

450

1

생성자를 공부중인데 this 생성자는 꼭 첫줄에만 넣어야 하고 넣지 않으면 컴파일 오류가 난다고 하는데
꼭 첫줄에만 넣어야만 하는 이유가 있을까요?

MemberConstruct(String name, int age) {
    System.out.println("hello");
    this(name, age, 50);
}

답변 2

2

안녕하세요. 박수영님, 공식 서포터즈 OMG입니다.

프로그래밍 언어에는 언어를 만드는 사람 혹은 언어에 대한 표준을 정의하는 단체에서 정의하는 표준이 있습니다. 표준에는 제약이 있는 경우도 있고 없는 경우도 있습니다.

제약에 대한 의미를 좀 더 쉽게 받아드리기 위해 제약이 없는 경우에 대해 예시를 들겠습니다.

(설명드리기 전, 참고로 '생성자'를 학습중이셔서 아직 아래의 키워드 (private, static, final)에 대해 낯설 수 있는데요. 이러한 키워드가 있다 정도만 알고 넘어가시고 다음 섹션들에서 배우니 참고해주세요 😀)

 

아래의 코드는 private final static 키워드 선언의 순서에 제약이 없어 제각각 다른 순서이지만 실행에는 전혀 문제 없이 동일한 동작을 하는 코드입니다.

image

반면 this()의 경우 제약을 통해 객체 생성과 초기화 과정을 일관되고 예측 가능하게 만들기 위해 첫줄에만 위치할 수 있도록 제약이 추가되었다고 이해하시면 될 것 같습니다.

만약 이러한 제약이 없어 this()의 위치가 첫줄이 아닌 코드 중간에 있다면 이전 혹은 이후에 작성한 코드로 인해 초기화 흐름을 이해하기 조금 더 복잡했을 거란 생각이 드네요 😀

개인적으로 생각했을 때 잘 추가한 제약조건이지 않나 생각합니다.

-

감사합니다.

0

상속 구조로 되어있는 상태에서 클래스를 메모리에 올려서 사용해야하기 때문에 반드시 생성자의 첫번째 줄에만 this()를 사용하는것으로 알고있습니다 그리고,

다른생성자를 찾아 호출해서 그다음 오는 코드를 수행해야하는데 첫줄에 this()가아닌 다른 코드가 있으면 그코드를 어떻게 사용해야하는건지 컴파일러가 알수 없기때문에 일단 this()를 찾고 그안의 코드를 수행할수 있도록 하는거죠

. 만일 this()를 쓰지않아서 없다면 생성자 안에는 코드상 눈에는 안보이지만 super()가 첫줄에 만들어진다고 합니다.

음.. 그리고 부모 클래스에 오버로딩 된 생성자만 있고 기본생성자가 없을때도 컴파일 오류 납니당

쓰고 보니 좀 두서가 없는거같네영 ^^:;;

wechi님의 프로필 이미지
wechi

작성한 질문수

질문하기