Published:
Updated:

객체의 메모리 할당 방법

아래와 같이 new를 사용하여 객체(인스턴스) student를 만들면 Java 가상 머신은 코드를 읽고 메모리가 얼마나 필요한지 계산하고 그만큼의 공간을 힙에 할당합니다. 그리고 힙에 있는 공간을 가리키는 4바이트짜리 포인터를 하나 만듭니다.

Student s = new student();


상속

여러 개의 객체가 있으면 상속을 활용하여 객체 간의 관계를 나타냅니다. 대학에 있는 People, Student, Undergraduate 클래스를 만들어봅시다.

Person: 대학에 있는 여러 사람입니다. 변수는 redid(빨간색 ID 카드), name, email입니다.

Student: 대학생들입니다. 변수는 GPA, 지금까지 들은 수업들입니다.

Undergraduate: 학부생들입니다. 변수는 year입니다.


이렇게 3개의 클래스를 구성하면, 학생이 사람에 속하게 되고 학부생이 학생에 속하게 되면 학부생도 사람에 속하게 됩니다. 이러한 관계를 나타내기 위해 상속을 사용합니다. 클래스를 정의할 때, 아래와 같이 extends를 사용하여 나타내면 됩니다.

public class Person{
}
public class Student extends Person{
}
public class Undergraduate extends Student{
}

이제 Student 클래스를 만들면 Java 가상 머신은 이 클래스가 Person을 상속한다는 것을 알아채고 Person 클래스에 있는 변수와 메소드를 모두 가져옵니다. 마찬가지로, Undergraduate 클래스를 만들면 Student 클래스에 있는 변수와 메소드를 모두 가져옵니다.


특징 1. Java에서 각각의 클래스는 하나의 클래스만 상속받을 수 있습니다.

어떤 프로그래밍 언어에서는 여러 클래스를 상속받을 수 있는데, 이를 다중 상속이라고 합니다. 하지만 이럴 경우, 만약 상속받은 다른 클래스에도 같은 redid 변수가 있다면 두 개의 다른 클래스를 상속받았을 때 둘 중 어느 것을 의미하는 것인지 알 방법이 없습니다. 이런 문제를 방지하기 위해, Java와 여러 다른 프로그래밍 언어에서는 다중 상속을 허용하지 않습니다.



특징 2. 상속받는 클래스의 정보만 갖고 있습니다.

이러한 대학의 계층 구조를 위와 같이 그려볼 수 있습니다. 이 구조에서 학부생은 교직원이나 관리 직원들에 대한 정보는 가지고 있지 않습니다. 즉, 트리를 올라갈 수만 있습니다.


특징 3. 상속받는 클래스의 공간을 함께 할당합니다.

Undergraduate u = new Undergraduate();

상속을 받은 상태로, 새로운 객체 Undergraduate u를 정의하면, u에는 4바이트가 할당됩니다. 그리고 이 포인터가 가리키는 힙에는 Undergraduate에 맞는 공간이 할당됩니다. Undergraduate에 있는 year, Student 클래스에 들어 있는 모든 변수, Person 클래스에 들어 있는 redid, name, email 등의 변수도 힙에 들어갑니다.


Student s = new Undergraduate();

위와 같이, s라는 이름의 Student를 만들 수도 있습니다. 이렇게 코드를 적으면 Undergraduate 객체에 필요한 만큼 공간을 할당받고 Person의 변수, Student의 변수, Undergraduate의 변수를 모두 알 수 있습니다. 따라서, Student 클래스의 변수를 파악하고 메모리를 계산할 수 있습니다.


Undergraduate u = new Student();

하지만 반대로 할 수는 없습니다. 이런 코드를 쓰게 되면 힙에 할당되는 공간은 Student에 해당하는 만큼입니다. 하지만 이렇게 되면 Student에 포함된 내용과 Person에 포함된 내용만 알 수 있습니다. Undergraduate 클래스의 내용은 접근할 수 없기 때문에, 이 코드는 컴파일되지 않습니다.


Source

Leave a comment