인스턴스의 개념을 알아보고 생성된 객체가 어떻게 메모리에 잡혀 있는지 알아보도록 하겠습니다.
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student();
studentLee.studentName = "이순신";
studentLee.address = "서울";
studentLee.showStudentInfo();
Student studentKim = new Student();
studentKim.studentName = "김유신";
studentKim.address = "경주";
studentKim.showStudentInfo();
}
}
지난 시간 만들었던 StudnetTest에 studnetKim을 추가로 생성해서 만들었습니다.
studentLee 나 studenKim 처럼 하나의 클래스를 기반으로 생성자라는 new키워드를 통해서 여러개의 객체를 생성 할 수 있는데 그 생성된 객체들을 인스턴스라고 부릅니다.
studnetLee는 생성된 Student 인스턴스를 가르키는 참조변수라고 부르고 참조변수의 "."을 붙이면 클래스가 가지고 있는 멤버변수나 메소드를 참조할 수 있습니다.
메모리가 어떻게 잡히는지 살펴보면 studnetLee 같은 참조변수는 지역변수 이기 때문에 앞에서 배운것 처럼 Stack 메모리에 잡히게 되고 new 키워드로 생성된 Student 인스턴스는 생성된 순간 Heap 메모리에 잡히게 됩니다. 이때 참조변수는 생성된 메모리가 heap메모리 어디에 잡혀있는지 참조하는 역할을 합니다.
생성된 Student 인스턴스 메모리 안에는 Student의 멤버변수가 함께 저장되게 됩니다.(studentID;studentName;address;) 그래서 참조변수에 .을 했을 때 해당 인스턴스에 멤버변수들이 참조값으로 뜨게 되는 것 입니다.
정리해보면 각각의 인스턴스는 생성된 순간 별개의 독립적인 메모리로 잡히게 되고 참조변수는 해당 인스턴스의 메모리 위치를 참조하는 역할을 하게 됩니다.
System.out.println(studentLee);
System.out.println(studentKim);
//결과값
classpart.Student@5305068a
classpart.Student@1f32e575
main함수에 참조변수인 studentLee와 studentKim을 출력해보면 다음과 같이 클래스의 풀네임(pakcage name + class name)@참조값 유형으로 나타납니다.
참조값은 16진수로 한자리의 4비트를 포함하기 때문에 Student class에 32비트가 할당됨을 알 수 있습니다.
public class Student {
public int studentID;
public String studentName;
public String address;
public void showStudentInfo(){
System.out.println(studentName +","+ address);
}
public String getStudentName() {
return studentName;
}
public static void main(String[] args) {
}
}
위와 같이 클래스 내에 실행 함수인 main을 포함시킬 수도 있지만 main 함수는 Student클래스에 메서드가 아닌 독립적인 함수 입니다. 이런 부분에 혼동을 피하기 위해 Test 클래스를 따로만들어 실행시키는게 좋습니다.
잘 읽었습니다~ 감사합니다