주인장의 프로그래밍 개발 공부방

[Chapter 1 변수] 7. 참조형 변수(Reference Variable)의 기본개념 본문

프로그래밍 기본 지식/Chapter 1 변수

[Chapter 1 변수] 7. 참조형 변수(Reference Variable)의 기본개념

거신 2019. 5. 11. 22:51

우리가 지금까지 변수에 대해서 알아보면서

중점적으로 건드렸던 것은 변수 중에서도 기본형 변수(Primitive Variable)였다.

그런데 앞서 변수의 타입에 대해서 알아볼 때

우리가 배우는 자바(Java)에서는 변수를 크게 2분류로 나눌 수 있다고 했었는데

하나는 기본형 변수(Primitive Variable)이고

나머지 하나는 바로 이번에 알아볼 참조형 변수(Reference Variable)이다.

 

목표 : 참조형 변수가 무엇인지 알고 기본형 변수와의 차이를 이해할 수 있다.

 

1. 참조형 변수(Reference Variable)란?

 

기본형 변수는 우리가 잘 알고 있듯이 값을 저장하는 저장공간이다.

그렇다면 참조형 변수는 뭔가 다른 것일까?

크게 보자면 참조형 변수도 일단 변수이기 때문에 값을 저장하는 공간이 맞다.

그러나 저장하는 그 값이 완전히 다른 것이다.

 

기본형 변수에 저장되는 값은 리터럴, 즉, 실제 값이 저장된다.

다시 말해, 10, A, true 등 있는 그대로의 값을 저장한다는 뜻이다.

하지만 참조형 변수는 다르다.

맨 처음에도 한 번 언급한 적이 있지만 참조형 변수는 실제 값이 아닌

주소 값을 저장한다.

 

여기에서 또 신기한 녀석이 등장했다.

주소 값.

컴퓨터에서 주소 값이라고 하면 www로 시작하는

인터넷 주소같은 걸 말하는건가?라고 생각하겠지만

의미는 맞지만 주소가 가리키고 있는 장소가 다르다.

 

우리가 쓰고 있는 컴퓨터의 메모리에 메모리 주소라는 개념이 들어있다.

즉, 메모리 안에도 주소별로 저장 공간이 배정되어 있다는 뜻이다.

이 주소는 사용자가 확인은 할 수 있지만 직접 정하거나 바꿀 수는 없다.

 

다시 본론으로 돌아와서 참조형 변수는 앞서 설명한 주소 값을 저장하는 변수가 되겠다.

 

2. (심화)참조형 변수와 기본형 변수의 차이

 

자, 일단 참조형 변수에는 주소 값이라는게 저장된다는 것까지는 알겠다.

그렇다면 기본형 변수와 정확하게 어떻게 다르며

왜 참조형 변수에는 주소 값이 저장되는지에 대해서 알아보자.

 

먼저 그 이유를 알아보기 전에

간단하게 메모리 안을 들여다보자.

메모리의 구조는 그림보다 더 세분화가 되어 있지만

간단하게 3개의 영역으로 나눠보자면

Class/Method/Static영역이라고 되어 있는 부분과

Stack영역, 그리고 Heap영역으로 나눌 수 있다.

우리가 지금 알고 있어야하는 부분은 바로 Stack영역Heap영역이다.

 

앞에서도 말했지만 메모리는 공간마다 주소 값을 가지고 있다고 했었다.

이는 모든 영역에서 동일하다.

 

이 구조를 보면서 설명을 하자면

기본형 변수실제 값이 저장이 되는데 만약 우리가 변수를 선언하면

Stack영역에 선언한 변수만큼의 공간이 생성이 되고

그 공간 안에 값이 들어가게 된다.

그림처럼 int i = 10;이라고 변수를 선언하게 되면

Stack영역4byte크기의 이름이 i라는 공간이 생성되고

그 안에 10이 들어가게 되는 것이다.

 

그런데 참조형 변수는 얘기가 조금 다르다.

아직 우리가 참조형 변수를 어떻게 선언하는지에 대해서 자세히 알아보진 않았지만

참조형 변수를 선언해서 예시로 들어보겠다.

 

String str = new String("java");

 

참조형 변수의 선언은 이러한 형태로 하게 되는데

기본형 변수와 비슷한 부분도 있고 다른 부분도 보일 것이다.

예시와 같이 변수를 선언하게 되면 메모리에서 이런 동작을 하게 된다.

기본형 변수처럼 Stack영역str이라는 이름을 가진 공간이 생성이 된다.

여기에서 생성되는 변수의 크기는 4byte의 고정된 크기만 생성이 된다.

(자세한 이유는 나중에 배우겠지만 주소 값만 저장하는 공간이기 때문에 형태에 따른 크기 변화가 필요없기 때문이다.)

그리고 new라는 명령어가 Heap영역에 새로운 저장공간을 생성하게 된다.

공간의 크기는 우리가 넣으려는 값(java)의 크기만큼 생성한다.

그리고 이 공간은 메모리 주소 값을 할당받게 된다.

 

쉽게 말해서 우리가 어떤 아파트의 몇동 몇호에 이사온거라 생각하면 된다.

이사를 왔으면 어느 아파트 몇동 몇호라는 주소를 갖게 되는거랑 똑같다.

물론 이건 Heap영역에 생성된 공간뿐만 아니라 Stack영역에 생성된 공간도 주소를 할당받게 된다.

기본형 변수도 마찬가지고.

하지만 여기서는 굳이 필요한 내용이 아니기 때문에 생략한 것이다.

 

다시 본론으로 돌아와서 이렇게 Heap영역에 공간이 생성되고 주소 값을 할당받으면

주소 값Stack영역에 생성된 str이라는 장소에 저장이 되는 것이다.

뭔가 굉장히 복잡하고 어렵다.

 

간단히 정리하자면 기본형 변수Stack영역에서 실제 값을 그대로 저장하지만

참조형 변수는 먼저 Stack영역에 공간을 생성하고 Heap영역에 새로운 공간을 생성해

실제 값을 저장한 다음에 그 공간의 주소 값을 불러와서 Stack영역의 공간에 저장한다는 것이다.

 

왜 이렇게 어렵고 복잡하게 만들었는지는 이 후에 객체라는 것을 배우게 되면

자연스럽게 이해할 수 있을 것이라 생각한다.

여기서 말한 참조형 변수가 바로 객체라는 것이고

자바 프로그래밍을 객체지향 프로그래밍이라고 칭하는 이유이기도 하다.

C언어보다 더 유리하고 좋은 게 많으니 이렇게 만들어 놨겠지.

아니면 뭣하러 이렇게 만들었겠나.

 

3. 마무리

 

내용이 너무 길고 어려웠는데

마지막으로 정리를 하자면

참조형 변수는 기본형 변수와는 다르게 실제 값을 그대로 저장하는 공간이 아니라

Heap영역에 값이 저장된 공간의 주소 값을 저장하는 공간이라는 것이다.

 

즉, 기본형 변수실제 값을 저장하고

참조형 변수주소 값을 저장하고 있는 것이다.

Comments