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

Kevin님의 프로필 이미지
Kevin

작성한 질문수

그림으로 배우는 자바, 파트2: 객체지향!

안녕하세요. 생성자관련?하여 질문드립니다.

작성

·

140

0

자식클래스가 부모클래스를 상속하는 경우에 부모클래스의 필드값을 쓰고싶으면 생성자를 통해 초기화를 보통 했었는데요.

갑자기 든 생각인데 자식클래스에서 부모클래스의 값을 바로 초기화 할 수 있는 방법은 없는걸까요?

부모클래스(동물), 자식클래스(조류)인 경우에

public class 동물{

String value;

}

일때 자식클래스에서 동물의 참조변수를 만들어서 동물 클래스의 value에 접근하려해도 안되고, 당연하지만 '.'으로 접근도 불가능해서

public class 조류{

public 조류(){

value = "새";

}

}

이런식으로 꼭 생성자를 통해서만 초기화가 가능한걸까요?

 

답변 1

0

홍팍님의 프로필 이미지
홍팍
지식공유자

자식 객체가 완성되려면
부모 영역부터 만들어져야 합니다.

2층 건물을 지으려면
1층 건물이 먼저 지어져야만 하는 것 처럼 말이죠

따라서,
자식 생성자의 첫줄은 반드시
부모의 생성자 호출이 이뤄져야합니다.

여기서 부모의 생성자
즉, super()의 호출은
부모 영역 객체의 생성과 필드값을 초기화 하는데,

이를 통해 값을 초기화하는 것이 올바른 방법입니다.

Kevin님의 프로필 이미지
Kevin
질문자

http://colorscripter.com/s/DPrjZj5

코드 링크입니다.!

 

 

 

 

사실 원래 코드가 이런데 제가 무분별하게 생략을 해서 질문을 드린것 같네요.; 죄송합니다.;;

 

 

실행클래스에서 bird 참조객체를 통해 부모클래스인 동물의 showMe 메서드를 사용해

 

동물의 String필드값을 초기화해서 "조류" 초기화함이 목적인데

 

메인실행 클래스에서 " = new 조류() " 자체가 조류클래스의 생성자 조류() 실행시킨다고 봐야하는 건가요?

 

(참조객체인 bird 만들기위해 new 조류() 할때 동물의 myClass 값이 바로 초기화 된다고 보는걸까요?)

 

 

2. 해당방법말고 혹시 동물 클래스에있는 필드값을 생성자를 통한 초기화가아닌 다른방법은 없는지 질문같이 부탁드리겠습니다..!

홍팍님의 프로필 이미지
홍팍
지식공유자

실행클래스에서 bird 참조객체를 통해 부모클래스인 동물의 showMe 메서드를 사용해

 

동물의 String필드값을 초기화해서 "조류" 초기화함이 목적인데

👉 showMe() 에서 값을 초기화하는 것을 추천하지 않습니다.

 

메인실행 클래스에서 " = new 조류() " 자체가 조류클래스의 생성자 조류()  실행시킨다고 봐야하는 건가요?

👉 맞습니다. 생상자의 호출은, new 키워드와 함께 수행됩니다.

 

(참조객체인 bird 만들기위해 new 조류()  할때 동물의 myClass 값이 바로 초기화 된다고 보는걸까요?)

👉 자세히 풀어 설명하면, 조류 객체(2층)가 만들어지기 위해 먼저 동물 영역(1층)이 생성되고, 그 다음 조류 객체가 완성됩니다. 이 때, 부모의 필드 myClass가 조류() 생성자에 의해 초기화 됩니다. 더 자세한 내용은 "상속 관계에서의 생성자 호출" 과정을 학습해보세요

 

2. 해당방법말고 혹시 동물 클래스에있는 필드값을 생성자를 통한 초기화가아닌 다른방법은 없는지 질문같이 부탁드리겠습니다..!

👉 객체의 필드값 초기화는 생성자 또는 세터를 통해 초기화하는 것이 좋습니다. showMe() 메소드에서 값을 초기화하는 것은 추천하지 않습니다. 

 

Kevin님의 프로필 이미지
Kevin
질문자

시간내 답변해주셔서 감사합니다! 해당부분 찾아 공부하겟습니다 !

Kevin님의 프로필 이미지
Kevin

작성한 질문수

질문하기