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

류경호님의 프로필 이미지

작성한 질문수

(2024) 일주일만에 합격하는 정보처리기사 실기

Java언어 기출문제의 변형

생성자 문제 질문 this() 질문

해결된 질문

24.07.17 15:56 작성

·

181

0

4:32초 문제 메인 클래스 두번째 줄 A s2 = new B('Y"); 를 실행하면 B(char x) 생성자를 호출하잖아요.

여기서 원래 부모의 기본 생성자를 불러야 하는데 this();가 첫줄에 있어서 B클래스의 기본생성자를 호출한거죠??

this();때문에 B클래스의 기본생성자를 호출햇는데

B클래스의 기본생성자에 super();가 없었어도

A클래스의 기본생성자 호출 -> B클래스의 기본생성자 호출

-> B(char x)의 출력문 시행하는게 맞을까요??

답변 3

1

류경호님의 프로필 이미지
류경호
질문자

2024. 07. 18. 12:56

친절한 답변 감사드립니다. this() 때문에 혼동이 왓네요 ..!

0

주말코딩님의 프로필 이미지
주말코딩
지식공유자

2024. 07. 17. 23:00

안녕하세요.

저도 ChatGPT 4o , Claude 3.5 sonnet을 쓰지만 논리연산자가 많거나 많은 수식이 있는 경우에는 출력값의 설명이 굉장히 많이 틀립니다. 코드를 직접 실행하는게 아니라 그 다음에 올 출력값을 예측해서 확률적으로 찍어내기 때문에 모든 것을 믿으시면 절대 안됩니다.


질문에 답변을 드리자면,

 

  1. 정상적으로 this, super가 없을 때는 B의 매개변수 1개 있는 생성자만 생성되고 끝납니다.

     

    (물론 부모의 기본 생성자는 당연히 출력됩니다. 아시죠? 이건 Java의 그냥 기본입니다. 자식이 태어날 때 부모의 파라미터 없는 생성자 필수)

  2. 그런데 갔는데 this()가 있어서 본인(자식)의 기본생성자를 부른게 맞습니다.

B클래스의 기본생성자에 super();가 없었어도

A클래스의 기본생성자 호출 -> B클래스의 기본생성자 호출

-> B(char x)의 출력문 시행하는게 맞을까요??

이것도 맞는 말씀이십니다. 어차피 부모의 기본생성자는 가장 먼저 불립니다. 부모가 태어나야 자식이 태어나니까요. 그래서 super()가 있으나 없으나 똑같습니다. 시험을 낼 때 헷갈리게 하려고 일부러 넣는 겁니다.

0

류경호님의 프로필 이미지
류경호
질문자

2024. 07. 17. 16:47

22분 문제에서는

chi(){ this(20); syso("chil()")인데 this(20)먼저 안하시고 부모생성자부터 생성하네요.

4:32초에서 this();보다 부모생성자 먼저 생성하면

답이 XABY가 아니고 XAABY 로 되요.

머가 맞는지 햇갈려요.

류경호님의 프로필 이미지
류경호
질문자

2024. 07. 17. 17:23

직접 출력해보니깐 XABY이 나오네요...

멘붕 ㅠㅠ...

22분 문제에서는 this(20) 으로

chi(20) 생성자에 super이 없어서 그냥 부모생성자

먼저 호출한걸까요?? gpt도 틀린답만 줘서 답답하네요

주말코딩님의 프로필 이미지
주말코딩
지식공유자

2024. 07. 17. 23:06

죄송합니다. 질문 자체가 이해가 안되어서 22분 문제를 해설로 작성해드립니다.

 

일단 하나 답변드리자면,

Chi에 super가 없어서 부모 기본생성자 호출한건가요? -> 네. 기본생성자는 그냥 무조건 때리고 시작입니다.

 

22분은 그냥 자식 형태에 자식이 선언된겁니다. chi는 child를 그냥 짧게 한거라서 Child, Parent라고 부르겠습니다.

 

Java에서의 기본 원칙은 무조건 부모의 기본생성자를 일단 때리고나서 그 다음에 나 태어나는 겁니다. 그외에는 상황에 따라서 같이 보는 겁니다. 만약 부모의 기본생성자가 아닌 다른 형태의 생성자(파라미터가 있는)가 태어났으면 그냥 끝입니다. 그것도 부모의 생성자가 불렸으니까 태어난 것으로 간주합니다. 부모 생성자에서 스스로(부모 스스로) 본인 생성자를 부르지 않는 한 그렇습니다. (부모도 자기 자신을 this()로 뭐 왕창 불러댈 수 있겠죠?)

 

기본 전제는 일단 그렇고, 지금 코드를 봅시다.

그냥 코드 자체를 따라가면 Child() -> Child(하나짜리) 이렇게 체이닝이 되어있습니다.

근데 부모 먼저 태어나야 한다고 했죠? 그래서 Child쪽을 소화하기 전에 부모한테 가봅시다.

Parent() 소화하려고 갔는데, 부모가 부모 스스로를 부릅니다. 그래서

Parent() -> Parent(하나짜리) 갔네요.

 

이게 끝입니다. 뭐 없어요.

 

대원칙

  1. 부모 먼저 태어나자 -> 갔더니 지들끼리 부르고 난리났다. 그 순서대로 호출

  2. 이제 자식 태어나자 -> 갔더니 지들끼리 부르고 난리났다. 그 순서대로 호출

끝입니다.