상속관련 궁금한 부분이 있어 질문남깁니다.
아래의 프로그램은 son 클래스가 mother클래스를 상속하는데, mother클래스타입에 son객체를 참조하여 사용하는 것을 구현했습니다.
궁금한 부분은 아래 출력값을 보면 stack영역에 저장된다는 리퍼런스 주소값은 so객체나 ms객체나 동일합니다.
그러면 동일한 heap의 영역을 가르키는 것이지 않나요?
Q 그러면 왜 부모타입은 사용할 수 없나요(ms.b)?
Q 객체 타입의 변수 선언의 의미가 무엇인가요?(메모리 준비 + 메모리의 성질(정수나 실수, 문자, 객체의 전역변수들) 표기 이런건가요?)
(부모클래스타입은 자식클래스를 알 수 없기 때문이라는 것은 이해하겠는데 메모리적인 관점에서 똑같은 영역을 가르켜서 다소 이해가 안되네요...(다소 필요없는 부분일수 있는데 어려워서 질문하네요))
```
class Mother
{
public int a;
public Mother()
{
a= 200;
}
}
class Son extends Mother
{
public int b;
public Son()
{
b= 100;
}
}
public class SystemDemo {
public static void main(String[] args) {
Son so = new Son();
Mother ms = so;
System.out.println(so);
System.out.println(ms);
System.out.println(so.b);
// System.out.println(ms.b);
System.out.println(so.a);
System.out.println(ms.a);
}
}
```
sehongpark님의 답변
## Q1. 왜 부모타입은 사용할 수 없나요(ms.b)?
ms와 so는 똑같은 메모리주소를 가리키지만, 끝번지 주소가 다릅니다.
예를들어 0x100번지부터 0x200번지까지 `Mother` 객체 정보가 존재하고, 0x201번지부터 0x300번지 까지 `Son` 객체의 정보가 있다고 해봅시다.
이 때, ms의 타입이 Mother이기 때문에 끝번지 주소를 0x200까지만 읽습니다. 따라서, Son 객체에 저장되어있는 b를 찾을 수 없습니다.
## Q2. 객체 타입의 변수 선언의 의미가 무엇인가요?
레퍼런스 변수는 해당 객체를 가리키게 되고, 그 객체를 레퍼런스의 타입으로 해석합니다.
해석이라는 의미는(위에서 설명했듯이) 주소의 시작번지와 끝번지를 정한다고 풀어 설명할 수 있겠습니다.