작성
·
156
·
수정됨
답변 3
0
그럼 만약 부모클래스에 Parent(int x) 라는 생성자가 있다면, Child(int x) 보다 실행순서가 빠르다
라고 이해하고 있는데 맞나요?
그래서 Parent(int x) 가 // 8 로 주어졌을때,
전체 실행순서는 5-6-8-3-1-7-2 가 되는게 맞나요?
그리고 부모클래스에 기본생성자가 있다고 가정해도, main 에서 자식클래스의 생성자 호출할 때 매개변수가 있기 때문에 부모의 기본 생성자는 호출되지 않는다.
라고 이해하고 있는데 맞을까요?
아, 해당 영상에 기본 생성자가 없는 경우였군요. 저는 둘 다 있을 때 일반적인 상황을 말씀드린 거였습니다. (위에 2번 답변)
문제를 보면서 정확하게 답변드리자면,
Parent(int x)는 아예 실행 안됩니다. 애초에 부모의 숫자 파라미터 1개짜리 생성자를 호출하지 않습니다.
지금 이 경우에는 부모에 기본생성자가 없기 때문에 불리지 않지만, 부른다고 하더라도 없는 생성자를 불러서 에러가 발생합니다. 있다고 하더라도 super(int x, int y)만 불렀기 때문에 부모 기본생성자를 불리지 않습니다.
그럼 super가 없는 코드에서 실행순서를 묻는 문제가 나왔을 때,
부모와 자식에 기본 생성자가 있고 main 에서 자식클래스의 생성자 호출할 때, 자식 생성자에 super가 생략 되어있는 것이기 때문에 super()를 실행하는 것이므로 실행순서는 자식 생성자 -> 부모 생성자 이렇게 되는 건가요?
없는 경우에는 그냥 부모생성자 먼저 실행되고 자식생성자 실행된다고 쓰셔야 정답에 가깝습니다. super()가 생략된 것처럼 기본생성자를 실행시킨다고 외우는건 좋은데 실제로는 부모가 먼저 실행되고 그 다음에 자식 생성되는걸로 써야합니다.
혹시 제가 어디서 super()가 생략됐다고 표현한 적이 있을까요? 명시적으로 호출하지 않을 경우 기본생성자는 그냥 불린다고 해야 맞습니다. 저 표현이 제 기억에 없어서 여쭤봅니다.
헉.. 너무 헷깔리네요..ㅎㅎ
도움주셔서 감사합니다!!
제가 공부할 때 그냥 그렇게 외워버린 것 같습니다! 생략된 것처럼 보라고 하셨는데, 전 생략되어있다고 잘못 받아들인 것 같네요..! 이번에라도 알게 되어서 다행입니다ㅎㅎ
0
부모의 기본생성자가 있었으면, 먼저 태어나는 것이 맞습니다.
부모 기본 생성자에 별도의 출력문이 있으면 먼저 적는 것도 맞습니다.
저 경우에서 부모에 출력문이 있고, 자식의 출력문이 있으면 부모 것을 먼저 적습니다.
사람이 읽을 때는 위로가면서 읽는데,
만약에 출력문이 있다고 하면 super 적고 그 다음에 아래 child와서 적는 것입니다.
지금 주석은 Child(int x) // 이 부분입니다. 아래 블럭이 아니고요.
그래서 실제로 출력문은 super가 먼저 되어야 합니다.
하지만 이 문제는 자식메서드에서 명시적으로 부모의 특정 생성자를 호출합니다.
그 이야기는, 자식메서드에 들르지 않으면 어떤 생성자를 호출하는지 알 수가 없습니다.
그래서 자식을 먼저 찍고 위로 어떤 생성자를 보러 가야하는지 분기한다고 적는게 맞습니다.
정리) 만약에 각 블럭에 print문이 있다고 가정.
작성 순서는 ?
부모 먼저 적고 -> 자식 것 적고 -> 메인에서 그 다음 것 아래를 적는다.
자식 것이 먼저 출력될 수가 없는게, super는 무조건 최상단에 위치해있기 때문에 super가 먼저 실행됩니다.
시간 여유가 되실 때 수강평 하나 부탁드립니다.. 😃
그러면 만약에
super()가 없어도 Child(int x) //이렇게 되어있으면 Child(int x) //부터 실행되는 건가요? 아니면 이때는 Parent 생성자(인수가 없다고 가정)가 먼저 실행되나요?
우선 무조건 자식 생성자 블록을 접근하고, 부모 생성자로 가나요?
그렇게 되면 문제 논란이 있을 수는 있습니다.
좀 더 명확하게 아예 출력문이 주어질 것으로 생각됩니다.
출력문의 경우 말씀하신 대로
Parent 기본 생성자 -> Child 생성자 이렇게 출력해서 쓰시는 것이 맞습니다.
일단 무조건 자식 생성자 블록을 접근한다고 생각해버리면 Java 문제 다 틀립니다.
생성이나 출력은 무조건 부모 먼저로 생각하고 가서 작성하시죠.
정보처리기사 실기 문제를 출제하는 공단은 기본적으로 논리적 오류가 발생하는 문제는 출제를 잘 안냅니다. 내더라도 전원 정답처리 되기 때문에 너무 깊게 생각하시지 않는 것이 어떨까 싶습니다... 😀
1번은 제가 외부에 있어 잠시 후에 확인하고 답변드리겠습니다. Java의 원칙은 어쨌든 부모생성자가 다 완성되어야 자식이 생성될 수 있습니다.
2번. 맞습니다. 기본생성자 있어도 파라미터있는거 부르면 그것을 호출합니다.
그렇다고 무조건 안불리냐? 그건 아닙니다. 파라미터 있는 생성자 안에서 this() 불러버리면 파라미터 있는 생성자를 실행시키는 과정에서 기본 생성자도 실행됩니다.