참조란?

송규빈·2022년 5월 19일
1

참조란?

간단히 말해서 인스턴스의 위치에 대한 정보를 가리키는 것입니다.

// primitive

int a = 1;
int b = a;

System.out.println(a);

위 코드에서 출력은 어떻게 나올까요?
생각하신대로 1이 나옵니다.

이 과정을 보면,

a라는 변수에 1을 저장했고, b에서 a에 들어있는 값인 1이 b에 '복제'가 되는 것이죠.
위의 예시처럼 primitive type인 경우에는 이해하기도 쉽고, 단 번에 알아채셨을 겁니다.

이번엔 객체를 다른 예시를 들어보겠습니다.

// reference

class A{
	public int myId;
    
    A(int myId){
    	this.myId = myId;
    }
}

A a = new A(4);
A b = a;
b.myId = 5;

System.out.println(a.myId);

이 코드는 어떻게 나올까요?
만약 4라고 생각하신다면 글을 끝까지 읽어주세요.
정답은 5입니다.

❗️ 설명드리기 앞서 편의상 '주소값'이라는 단어가 많이 나올텐데, 여기서 말씀드리는 주소값은 메모리 주소를 말하는 것이 아닙니다.

원론적인 것부터 설명을 해보겠습니다.
Java에는 primitive type(기본 타입)과 reference type(참조 타입)이 있습니다.
primitive type은 Java의 메모리 구조 중 Stack 영역에 직접 값을 가지고 있고,
reference typeHeap 영역의 객체 주소를 Stack 영역이 갖고 있어요.

💡 여기서의 주소값은 Stack영역이 갖고있는 Heap영역의 객체 주소를 말하는 것입니다.
(참고로 C++의 포인터는 메모리 주소 자체를 관리합니다.)

a라는 참조 변수는 new 생성자로 만들어진 클래스 A의 인스턴스가 있는 주소값을 갖게 됩니다.
즉, 앞선 예제(primitive)의 경우처럼 4라는 값이 a에 저장되는 것이 아닌 myId값이 4인 클래스 A의 인스턴스가 있는 주소값이 저장되는 것이죠.

이 때, 이것을 '참조'라고 하고 위에서 말하는 주소값을 '참조값'이라고 하는 것 입니다.

A b = a; 이 부분을 보면 b라는 참조 변수는 a가 갖고있는 인스턴스 A에 대한 참조값을 갖게 됩니다.
이제 b.myId = 5; 는 클래스 A를 이용해서 만든 인스턴스가 갖고있는 myId값을 5로 변경을 하는 것이에요.

정리

System.out.println(a.myId) 부분을 정리해보자면, 변경된 myId값(5)를 갖고 있는 클래스 A를 이용해서 만든 인스턴스가 있는 주소값을 가리키는 참조 변수 a의 myId값을 출력하는 것이니 5가 출력이 되는 것입니다.

profile
🚀 상상을 좋아하는 개발자

0개의 댓글