자바에는 참조변수와 일반변수가 존재합니다. 일반변수와 참조변수란 무엇일까요.
일반변수란 원시타입을 사용하여 선언된 변수를 말합니다.
| 종류 | 데이터형 | 크기(byte) | 표현 |
|---|---|---|---|
| 논리형 | boolean | 1 | true or false |
| 문자형 | char | 2 | 유니코드 문자데이터 |
| 정수형 | byte | 1 | -128 ~ 127 |
| 정수형 | short | 2 | -32768 ~ 32767 |
| 정수형 | int | 4 | -2147483648 ~ 2147483647( -21억 ~ + 21억) |
| 정수형 | long | 8 | -9223372036854775808 ~ 9223372036854775807(-100경 ~ + 100경) |
| 실수형 | float | 4 | 1.4E-45 ~ 3.4028235E38 |
| 실수형 | double | 8 | 4.9E-324 ~ 1.7976931348623157E308 |
위와 같은 원시타입을 사용하여 실제 값을 저장합니다.

예를들면 코드를 실행하게 되면 각 코드의 변수는 어디에 저장이 될까요?
바로 램메모리에 저장이됩니다. 위의 그림과 같이 램메모리는 3가지의 영역으로 나뉩니다.
Stack : 일반변수를 저장하는 구역
Heap : 참조변수를 저장하는 구역
Static : static변수를 저장하는 구역
일반변수는 Stack메모리에 저장이 됩니다. 쉽게 말해 우리가 흔히 int a = 10; 과 같이 저장하는 일반변수는 Stack메모리에 저장이 됩니다.
그렇다면 참조변수는 무엇일까요
참조변수란(Reference Variables) 객체의 메모리 주소를 저장하는 변수입니다. 흔히 자바에서 문자열을 선언하면,
String str = "Hello World";
위와 같이 선언을 합니다. 이때 값은 str에 직접 저장되는 것이 아닌 주소값을 저장합니다.
그럼 위와 같이 주소값을 저장하는 것은 어떤 이유에서 일까요?
일반변수는 변수가 저장되면 Stack메모리에 저장이 되고 이것을 사용하기 위해서는 객체 자체를 복사하여 가져옵니다.
하지만 참조변수를 사용하게 되면 주소값을 불러오게 되므로 메모리의 효율성이 증가합니다.
또한 동적 메모리 할당, 다형성 지원등 많은 이점이 있습니다.