reference(참조)는 프로그램이 메모리나 다른 저장 공간에서 특정 변수의 값이나 레코드에 접근할 수 있도록 하는 값이다. 메모리 상의 객체의 주소 또는 참조값이 그 예시이다. object referenece(객체 참조)는 클래스로 만든 객체의 주소 또는 참조값에 해당한다. 객체(객체변수)는 기본 데이터 변수와 다르다. 객체 변수 선언 후 메모리를 생성(new 키워드 사용)해줘야 완전한 객체가 된다.
자바에서는 C언어와 다르게 메모리 상의 주소가 참조의 대상이 아니다. 자바에서는 객체의 주소 대신 참조값이라는 것을 할당받는다. 그런까닭에 자바에서의 객체 변수를 참조 변수(Reference Variable)라고 한다.
Student st1 = new Student();
Student st2 = new Student();
위의 st1
과 st2
는 Student의 객체 변수이자 Student의 인스턴스 참조 변수이다. st1
과 st2
에 객체 변수가 참조되는 과정은 아래와 같다.
public class Student {
public int class;
public int average;
}
Student st1 = null;
Student st2 = null;
st1 = new Student();
st2 = new Student();
객체 변수에 대한 메모리가 생성되면 내부 인덱스 테이블에서 주소 매핑 후 참조값을 만들고 참조값은 참조 변수 st1
과 st2
에 할당된다.
참조값은 객체의 메모리를 생성했을 때 메모리와 연결된 유일한 숫자값을 말하며, 이 숫자값을 참조 변수가 받아 저장하는 것이다. 자바에서는 참조값을 가지고 있으면 해당 객체를 핸들할 수 있다. 참조값으로 작업하면 참조값과 매핑된 주소로 작업하는 것과 동일한 효과가 있다.
인스턴스를 하나 생성하면 1)참조값을 저장하기 위한 공간(객체 변수를 위한 공간)과 2)new 했을 때 힙영역에 생성되는 객체 자체의 공간이 만들어진다.
참조 변수는 4바이트짜리 정수값이다. 그렇기 때문에 객체의 메모리를 할당할 때 4바이트의 정수값을 객체 변수에 할당한다.
Student st1 = null;
st1
은 4바이트짜리 참조 변수가 만들어진 것이다. 즉, 참조값을 저장할 수 있는 4바이트의 메모리만 확보한 상태이다. new를 이용하여 객체가 생성되지 않은 상태이므로 st1
에는 현재 4바이트의 메모리에 null값이 들어있다.
st1 = new Student();
st1
이라는 변수에는 객체의 참조값을 받을 수 있다. new Student()를 실행하면 객체의 메모리가 생성되고 메모리 상의 주소와 매핑된 참조값이 st1
에 할당된다. st1
이라는 참조 변수는 단순히 정수형 숫자(참조값)를 담을 수 있는 4바이트짜리 메모리일 뿐이다.