인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

otter님의 프로필 이미지
otter

작성한 질문수

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

(기출) 2024년 1회 코드해석 문제

자바 실행순서 문제 질문

작성

·

156

·

수정됨

0

안녕하세요, 강의 정말 잘 듣고 있습니다.

23:30 자바 실행순서 문제입니다.

클래스를 호출할 때, 부모 클래스가 있다면 부모 클래스부터 호출되는 걸로 알고 있는데, 그럼 5 -> 6 -> 1 -> 3 -> 1 -> 7 -> 2가 아닐까요?

super()가 있어야지만 부모 클래스가 호출되는 건가요?

감사합니다.

답변 3

0

  1. 그럼 만약 부모클래스에 Parent(int x) 라는 생성자가 있다면, Child(int x) 보다 실행순서가 빠르다
    라고 이해하고 있는데 맞나요?
    그래서 Parent(int x) 가 // 8 로 주어졌을때,
    전체 실행순서는 5-6-8-3-1-7-2 가 되는게 맞나요?

  2. 그리고 부모클래스에 기본생성자가 있다고 가정해도, main 에서 자식클래스의 생성자 호출할 때 매개변수가 있기 때문에 부모의 기본 생성자는 호출되지 않는다.
    라고 이해하고 있는데 맞을까요?

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

1번은 제가 외부에 있어 잠시 후에 확인하고 답변드리겠습니다. Java의 원칙은 어쨌든 부모생성자가 다 완성되어야 자식이 생성될 수 있습니다.

 

2번. 맞습니다. 기본생성자 있어도 파라미터있는거 부르면 그것을 호출합니다.

그렇다고 무조건 안불리냐? 그건 아닙니다. 파라미터 있는 생성자 안에서 this() 불러버리면 파라미터 있는 생성자를 실행시키는 과정에서 기본 생성자도 실행됩니다.

  1. 네 기다리겠습니다. 감사합니다!

  2. 자식클래스에 기본 생성자가 없기 때문에, 파라미터 있는 생성자에서 this()를 부르면 부모클래스의 기본 생성자가 실행되는 건가요??

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

아, 해당 영상에 기본 생성자가 없는 경우였군요. 저는 둘 다 있을 때 일반적인 상황을 말씀드린 거였습니다. (위에 2번 답변)

 

문제를 보면서 정확하게 답변드리자면,

  1. Parent(int x)는 아예 실행 안됩니다. 애초에 부모의 숫자 파라미터 1개짜리 생성자를 호출하지 않습니다.

  2. 지금 이 경우에는 부모에 기본생성자가 없기 때문에 불리지 않지만, 부른다고 하더라도 없는 생성자를 불러서 에러가 발생합니다. 있다고 하더라도 super(int x, int y)만 불렀기 때문에 부모 기본생성자를 불리지 않습니다.

그럼 super가 없는 코드에서 실행순서를 묻는 문제가 나왔을 때,
부모와 자식에 기본 생성자가 있고 main 에서 자식클래스의 생성자 호출할 때, 자식 생성자에 super가 생략 되어있는 것이기 때문에 super()를 실행하는 것이므로 실행순서는 자식 생성자 -> 부모 생성자 이렇게 되는 건가요?

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

없는 경우에는 그냥 부모생성자 먼저 실행되고 자식생성자 실행된다고 쓰셔야 정답에 가깝습니다. super()가 생략된 것처럼 기본생성자를 실행시킨다고 외우는건 좋은데 실제로는 부모가 먼저 실행되고 그 다음에 자식 생성되는걸로 써야합니다.

 

혹시 제가 어디서 super()가 생략됐다고 표현한 적이 있을까요? 명시적으로 호출하지 않을 경우 기본생성자는 그냥 불린다고 해야 맞습니다. 저 표현이 제 기억에 없어서 여쭤봅니다.

헉.. 너무 헷깔리네요..ㅎㅎ
도움주셔서 감사합니다!!

 

제가 공부할 때 그냥 그렇게 외워버린 것 같습니다! 생략된 것처럼 보라고 하셨는데, 전 생략되어있다고 잘못 받아들인 것 같네요..! 이번에라도 알게 되어서 다행입니다ㅎㅎ

0

16분29초 마지막 프린트문에 "변환된 문자열 : %\n", result 인데 개행을 해야 하는거 아닌가요?

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

개행 되어야 하는 것이 맞습니다.

그런데 시험에서는 맨 마지막 개행은 어차피 빈칸이라서 종이에 쓰면 큰 의미는 없지 않을까 싶습니다.

다만 앞의 문자열이 작성이 안되어있네요.

 

변환된 문자열: Nd sc 1

로 답안을 작성하면 정답처리 될 것입니다.

0

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

부모의 기본생성자가 있었으면, 먼저 태어나는 것이 맞습니다.

부모 기본 생성자에 별도의 출력문이 있으면 먼저 적는 것도 맞습니다.

저 경우에서 부모에 출력문이 있고, 자식의 출력문이 있으면 부모 것을 먼저 적습니다.

 

사람이 읽을 때는 위로가면서 읽는데,

만약에 출력문이 있다고 하면 super 적고 그 다음에 아래 child와서 적는 것입니다.

지금 주석은 Child(int x) // 이 부분입니다. 아래 블럭이 아니고요.

그래서 실제로 출력문은 super가 먼저 되어야 합니다.

 

하지만 이 문제는 자식메서드에서 명시적으로 부모의 특정 생성자를 호출합니다.

그 이야기는, 자식메서드에 들르지 않으면 어떤 생성자를 호출하는지 알 수가 없습니다.

그래서 자식을 먼저 찍고 위로 어떤 생성자를 보러 가야하는지 분기한다고 적는게 맞습니다.


 

정리) 만약에 각 블럭에 print문이 있다고 가정.

 

작성 순서는 ?

부모 먼저 적고 -> 자식 것 적고 -> 메인에서 그 다음 것 아래를 적는다.

자식 것이 먼저 출력될 수가 없는게, super는 무조건 최상단에 위치해있기 때문에 super가 먼저 실행됩니다.


 

시간 여유가 되실 때 수강평 하나 부탁드립니다.. 😃

그러면 만약에

  1. super()가 없어도 Child(int x) //이렇게 되어있으면 Child(int x) //부터 실행되는 건가요? 아니면 이때는 Parent 생성자(인수가 없다고 가정)가 먼저 실행되나요?

  2. 우선 무조건 자식 생성자 블록을 접근하고, 부모 생성자로 가나요?

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

그렇게 되면 문제 논란이 있을 수는 있습니다.

좀 더 명확하게 아예 출력문이 주어질 것으로 생각됩니다.

출력문의 경우 말씀하신 대로

Parent 기본 생성자 -> Child 생성자 이렇게 출력해서 쓰시는 것이 맞습니다.


일단 무조건 자식 생성자 블록을 접근한다고 생각해버리면 Java 문제 다 틀립니다.

생성이나 출력은 무조건 부모 먼저로 생각하고 가서 작성하시죠.

정보처리기사 실기 문제를 출제하는 공단은 기본적으로 논리적 오류가 발생하는 문제는 출제를 잘 안냅니다. 내더라도 전원 정답처리 되기 때문에 너무 깊게 생각하시지 않는 것이 어떨까 싶습니다... 😀

otter님의 프로필 이미지
otter

작성한 질문수

질문하기