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

트릴님의 프로필 이미지
트릴

작성한 질문수

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

상속에서 this 질문있습니다.

해결된 질문

작성

·

72

0

결론부터 말씀드리면 자식 클래스 에서 아무런 멤버변수를 초기화하지 않을 때,

생성자에서 this.[변수명]으로 멤버변수를 초기화 할 수 있는걸로 압니다.

그런데 아래 이미지는 this로 접근한 동일 이름의 변수에서 왜 부모 변수가 변경되는건가요?

자기자신의 멤버 변수가 생성자에서 초기화되는 개념이 아닌가요?

 

  1. 부모의 price 100으로 고정

부모.PNG

 

  1. 자식 클래스에서 price를 생성자에서 초기화

자식.PNG

 

  1. 자식 인스턴스의 printCar() 메서드 호출 결과.

     

  2. 결과.PNG

  3.  

  4. 둘다 1000인 이유가는 무엇인가요? 부모는 100이 아닌

     

     

답변 2

1

안녕하세요. 트릴님, 공식 서포터즈 David입니다.

ElectricCar에 value 필드를 정의하지 않은 상태에서 this.value를 작성하시면 Car에 정의된 value를 참조하게 됩니다. 이는 상속으로 인해 발생하는 동작입니다.

인프런 AI 인턴의 답글에 답글을 다신 것처럼 ElectricCar에 value 필드를 (재)정의하신다면 this.value는 자신(ElectricCar)에게 정의되어 있는 value 필드를 참조하게 됩니다.

감사합니다.

트릴님의 프로필 이미지
트릴
질문자

감사합니다. 하나 더 배워가네요.

0

안녕하세요, 인프런 AI 인턴입니다. 트릴님.

자식 클래스와 부모 클래스 간의 상속 관계에서 this 키워드를 사용하여 멤버 변수를 초기화할 때의 동작과 관련하여 질문 주셔서 감사합니다.

이니셜라이제이션과 상속 관계

자바에서 클래스는 멤버 변수의 값을 클래스의 생성자 내에서 this 키워드를 사용하여 초기화할 수 있습니다. this는 현재 객체의 인스턴스를 참조하는 키워드로, 자식 클래스 생성자 안에서 사용되면 자식 클래스 자신의 멤버 변수를 의미합니다.

부모 클래스의 멤버 변수 초기화

부모 클래스의 멤버 변수 priceElectricCar 자식 클래스의 생성자에서 this.price로 바이패스되기 보다는, 상속 구조에서 자식 객체가 생성될 때 부모 클래스의 멤버도 객체의 일부로 포함됩니다. 두 클래스가 같은 변수명을 사용하면, 자식의 멤버 변수가 부모의 변수를 덮어쓸 수 있습니다.

자식 클래스 ElectricCar의 생성자

ElectricCar 생성자에서 this.price = price; 구문이 있다면, 이 구문은 자식 클래스의 price를 가리키게 되고 이 값이 Car 클래스의 price와 연결되어 부모 객체의 값에도 영향을 미칩니다. 왜냐하면, 상속된 price 변수는 클래스의 일부분이 되어 같은 스코프를 공유하기 때문입니다.

printCar() 메서드의 실행 결과

printCar() 메서드에서 호출된 price는 자식 클래스에서 초기화된 값이 1000으로 설정되었기 때문에, 부모 클래스의 price에 설정된 기본값인 100이 들어가지 않고 1000으로 덮어쓰여진 것을 보여줍니다.

만약 printCar() 결과에서 두 번의 1000 출력이 있는 경우, 이 의미는 자식의 price와 부모의 price 모두가 초기화를 통해 동일한 값을 갖고 있다는 것입니다.

이러한 개념은 상속과 객체의 메모리 구조와 직접적인 관련이 있으며, 다형성과 부모-자식 클래스 간의 스코프에 대해 좀 더 깊게 이해해야 완전히 숙지할 수 있는 주제입니다. 이 주제에 대한 심화된 내용을 원하시면 아래 링크들을 확인하시길 추천드립니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

트릴님의 프로필 이미지
트릴
질문자

이해가 되질않는군요... 자식 클래스에서 같은 이름의 value를 멤버 변수로 초기화 해주면 아래와 같이 결과가 다른데 말이죠

자식2.PNG

 

결과2.PNG

 

트릴님의 프로필 이미지
트릴

작성한 질문수

질문하기