JVM이 힙메모리에 인스턴스의 크기를 잡는 과정
아래 자료형은 각 타입이 메모리에서 차지하는 크기를 나타낸다. 그랬을 때 객체의 인스턴스는
메모리에서 얼만큼 공간을 차지할까?
int: 4bytes
short: 2bytes
long: 8bytes
Student s = new Studet();
JVM은 s라는 변수에 4bytes를 할당하고 해당 변수는 heap 메모리에 올라가 있는 인스턴스의 주소
를 갖는다. 그리고 JVM은 힙메모리에 올릴 객체의 인스턴스 크기를 계산해서 해당 크기만큼 메모리
위에 공간을 할당한다.
JVM은 인스턴스가 어디서 상속된 것인지 확인해서 메모리 영역을 할당한다. 어디서 상속된 것인지
확인하는 절차의 이유는 자바는 특정 클래스를 상속받아서 사용하는 경우가 빈번하기 떄문이다.
Java의 단일 상속과 생성자의 문법의 특징
Java에서는 하나의 클래스는 하나의 클래스만 상속받을 수 있다. 다중상속을 허용하지 않는다. 이러
한 특징으로 인해 객체에 대한 diagram을 그리면 클래스는 트리구조를 가지고 있다는 것을 알 수
있다. 여기서 알 수 있는 사실은 각 객체는 서로 서로 독립된 영역을 구성한다는 것이다.
여기서 재미있는 사실은 이부분이다.
class Person {
public String id = "SeoulUniversity";
}
class Student extends Person{
private int gpa;
}
class Undergraduate extends Student{
private String bachelorsDegree;
}
public class Main {
public static void main(String[] args) {
Student s = new Undergraduate();
System.out.println(s.id);
}
}
Person class를 상속받는 Student 클래스가 있고 Student class를 상속받는 Undergraduate class가
있다고 했을 때 Student s = new Undergraduate()로 문법을 작성할 경우 오류가 발생할까?
그렇지 않을까에 대한 부분이다.
위 코드를 복붙해서 돌려보면 알 수 있겠지만 오류가 발생하지 않는다. 그 이유는 Undergraduate class의
인스턴스 생성시 힙메모리에 영역을 차지하는 해당 객체에 Student의 인스턴스를 담을 충분한 공간이 있고
그 공간의 주소를 s라는 변수가 갖고 있기 때문이다.
제한이 있는데 그것은 Undergraduate가 Student를 상속하고 있고 그에 따른 형변환이 가능하기 때문에 위
의 문법에 이상이 없다. Person도 동일하다. 그렇지만 s를 통해서 Undergraduate 영역에 있는 변수나 메
소드는 접근할 수 없다. 단지 Undergraduate 객체의 크기를 가진 Student 모양의 인스턴스가 생성된 것
이다.