해결된 질문
작성
·
128
·
수정됨
0
이전 업캐스팅 부분이랑 상속부분이 이해가 완벽이 되지않아 반복하여 공부 중입니다.
해당 부분을 풀었을때
Parent: 5
Parent default
5
Child default 라고 답을 내놓았는데, 자식클래스의 display부분이 10이네요..
this에서 5를 받아왔기 때문에 5를 출력하지 않나요? 클래스가 다르기 때문에(혹은 static이 아니기때문에) 10이라고 생각해야할까요?
3분02초 부분을 업캐스팅 코드로 수정하였는데요..
class Parent {
int x = 25;
Parent() {
this(5);
this.display();
System.out.println("Parent default");
}
Parent(int x) {
System.out.println("Parent: " + x);
}
void display() {
System.out.println("Parentdis: " + x); } }
class Child extends Parent {
int x = 10;
Child() {
super();
System.out.println("Child default");
}
void display() {
System.out.println("Childdis: " + x);
}
Child(int x) {
System.out.println("Child: " + x); } }
public class TestInheritance {
public static void main(String[] args) {
Child child = new Child(); } }
this(5)부분을 Child: 5가 되지않나 싶은데 코드를 돌려보면 Parent: 5가 나오네요.
반면에 this.display()는 Childdis :10을 뽑습니다..
같은 업캐스팅임에도 불구하고 this가 가르키는게 생성자와 매서드가 다른가요?
답변 2
0
주서님, 코드의 답변과 별개로 시험 일주일 남았는데 헷갈리시면 큰일납니다.
시험에 안나오면 다행인데, 나오면 너무 아까운 5점을 날립니다.
일단 this의 개념에 대해서 다시 한번 잡으실 필요가 있습니다.
super / this에 대해서 설명해놓은 챕터가 있으니 꼭 한 번 다시 봐주시기를 권장드립니다.
(영상제목: Java에서 this와 super 키워드)
간단하게 설명하자면, this는 그냥 본인을 들고 있는 사람을 대신해주는 인형이라고 생각하면 됩니다.
상상하실 때, "내가 누구니" 라고 물어보면 무조건 그것을 들고 있는 사람의 이름을 얘기해주는 귀여운 인형입니다.
주서님이 이 인형을 들고 있으면 인형은 "주서님이요"라고 대답하고, 어머님께서 들고 계시면 "주서 어머님이요"라고 해줍니다.
대답은 바뀌는데 질문은 매번 똑같습니다 "내"가 누구니라고 물으니까요.
this는 그저 호출되는 객체가 대신 들어가는 지시대명사입니다.
지금은 둘 다 Parent가 들고 있으니 부모 클래스 내의 것으로 해석해야합니다.
둘 다 지금은 부모입니다.
그런데 display는 부모의 display를 실행하라고 했습니다.
문제는 자식이 재정의하고 있습니다.
업캐스팅에서 원칙이 뭐였죠?
자식이 재정의한 경우에는 인스턴스 메서드(static이 없는 메서드)는 자식 것을 실행합니다.
(재정의는 이름과 파라미터까지 포함입니다. 자식에서 파라미터 다르면 오버라이딩 안된 겁니다. 주의 깊게 보셔야 합니다.)
오버라이딩 (Overriding):
부모 클래스에 정의된 메서드를 자식 클래스가 재정의하는 것.
메서드 이름, 파라미터 타입, 파라미터 수, 리턴 타입이 부모 클래스의 메서드와 정확히 같아야 합니다.
접근 제어자와 예외 처리도 부모 클래스 메서드와 호환되어야 합니다.
그래서 자식이 실행됩니다.
그렇다고 시험에 나왔는데 냉큼 자식 것 쓰면 틀리겠죠?
앞에 static이 붙어있는 정적 메서드인 경우 생성된 main 함수에서 맨 앞 글자인 타입을 봐야합니다. 그게 Parent면 Parent의 메서드가 실행됩니다. 재정의 안됩니다. (hiding이라고 부름)
멘탈은 다시 잡으시면 됩니다. 아직 시간 많이 남았습니다.
화이팅입니다.
0
안녕하세요, 인프런 AI 인턴입니다. 주서님.
상속과 업캐스팅 부분에서 헷갈리시는 점을 정리해보겠습니다. 질문 내용을 바탕으로 중요한 내용을 간단히 설명해 드리겠습니다.
생성자와 this(): this(5);
는 현재 클래스에 정의된 정수형 파라미터를 받는 생성자를 호출합니다. 자식 클래스에서는 기본적으로 부모 클래스의 생성자가 먼저 호출되기 때문에 Parent: 5
가 출력됩니다.
메서드 호출의 경우: this.display();
는 객체가 실제로 생성될 때의 형태에 따라 Child 클래스의 display()
메서드를 호출합니다. 따라서 Childdis: 10
이 출력됩니다. 이는 자바에서의 다형성(polymorphism) 때문입니다.
업캐스팅에 대한 이해: 업캐스팅은 부모 클래스의 참조 변수로 자식 클래스 객체를 참조하는 것입니다. 이는 참조 변수의 타입은 부모 클래스로, 실제 객체는 자식인 형태입니다. 이로 인해 부모 클래스에서 정의된 것들은 부모 클래스의 정의된 대로 처리되지만, 오버라이딩된 메서드는 실제 객체의 클래스(자식 클래스)에서 구현된 메서드가 호출됩니다.
코드에서 모든 자식 클래스의 생성자는 부모 클래스의 생성자를 호출하게 되어 있습니다. 자바에서 이 생성자 순서는 항상 부모 생성자 -> 자식 생성자 순으로 진행됩니다. 다만, this.display();
와 같은 메서드 호출은 객체의 실제 타입에 따라 실행됩니다. 따라서 출력이 부모 생성자와 자식 메서드의 실제 값을 반영하게 되는 것이죠.
this(5);
를 호출하면, 부모 클래스의 같은 클래스 내 존재하는 Parent(int x)
생성자가 호출되어 Parent: 5
을 출력합니다.display()
메서드가 호출되어 Childdis: 10
을 출력합니다.비슷한 주제로 토론된 링크들을 추가로 참고하시면, 도움이 될 것입니다.
질문자님의 이해를 돕고자 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
맞습니다.. 언어 해석까지는 이제 어느정도 되는거같은데 디테일부분에서 자꾸 문제가 생기네요.. 저도 너무답답합니다 ㅠㅠ
하이딩과 업스케일링에서 개념을 잡다보니 상속에서 또 문제가 발생하네요..
Java에서 this와 super 키워드 강의 다시한번 듣겠습니다..