하나의 값을 저장할 수 있는 메모리 공간입니다. 여기서 메모리 공간은 RAM을 의미합니다. 메모리 공간을 1Byte 단위로 나누고 0부터 연속적인 번호를 부여하였는데 이것을 메모리 주소라고 합니다.
원래 메모리의 값을 저장하거나 읽을 때 메모리 주소를 이용해야하지만 이 메모리 주소는 숫자로 구성되어 사람이 기억하기 불편합니다. 그래서 특정 메모리 영역에 이름을 부여하고 주소대신 이름을 이용하여 메모리의 값을 저장하거나 읽을 수 있게 해주는게 변수입니다.
변수는 단 하나의 값만 저장할 수 있기때문에 변수에 새로운 값을 저장하게 되면 기존에 있던 값은 사라지고 새로 저장한 값만 남게 됩니다.
변수를 선언하는 것은 값을 저장할 공간을 마련하는 것 입니다. 변수의 선언하는 방법은 변수 타입과 변수 이름으로 선언할 수 있습니다. 이때 변수를 선언하고 실행되게 되면 변수이름의 저장 공간이 생성됩니다.
//변수의 선언
//[변수 타입] [변수 이름];
int age;
age = 0;
age = 25;
위의 코드를 보면 age라는 int 타입의 변수가 선언되고 age 값을 할당 할 수 있습니다.
기본형과 참조형 ( Primitive Type과 Reference Type )
기본형 ( Primitive Type )
1. char, short, int, long, float, double, boolean이 있습니다.
2. 기본값이 있기 때문에 null을 사용할 수 없습니다. ( 단, 초기화를 진행하지 않을 시 null일 수 있습니다. )
3. null을 사용하려면 Wrapper Class를 사용합니다.
4. 스택(Stack) 메모리에 실제 값을 저장합니다.
5. 컴파일 시점에 담을 수 있는 크기를 벗어나면 컴파일 에러가 발생합니다.
참조형 ( Reference Type )
1. 클래스, 인터페이스, 배열, 열거형 등 기본형 타입을 제외한 타입들 모두 참조형 타입입니다.
2. 값을 변수에 대입하지만 변수는 참조값을 가지고있지 값을 직접 들고있지는 않는 것이 특징입니다.
3. 힙(Heap) 메모리에 값이 저장되고 변수는 힙 메모리 영역의 주소값을 변수에 저장합니다.
4. null이 존재합니다.
메모리 구조 비교
기본형의 경우 할당된 값이 보이지만, 참조형의 경우 주소를 가지고 있습니다. 기본형의 경우는 JVM 메모리 공간의 Stack이라는 곳에서 관리되며 직접적을 값을 대입하여 사용합니다. 예제들을 통해 조금 더 알아보도록 하겠습니다.
예제1) 기본형
int a = 0;
int b = a;
b = 1;
b = 3;
b = 5;
위 예제를 보면 a에 0을 대입하고 b에 a를 대입했습니다. 기본형 변수는 값을 직접 저장하기 때문에 b에는 0이 직접 저장됩니다. 따라서 b의 값을 계속 변경하더라도 당연히 a는 값이 변화가 없습니다. 하지만 참조형의 경우는 다릅니다.
예제2) 참조형
Sample sample1 = new Sample("1");
Sample sample2 = sample1;
sample2.setName("2");
위 예제를 실행했을 때, 기본형과 같다면 sample1과 sample2의 name은 달라야 합니다. 하지만 참조형은 말 그대로 생성된 주소를 저장합니다. 위 예제에서 sample1을 선언할 때 new를 통해 Sample 객체를 생성하게 되면 JVM Heap 영역에 Sample의 인스턴스가 생성되고 해당 JVM Heap 영역의 주소값을 sample1 객체에 저장하게 됩니다.
그런데 sample2에 sample1을 대입하게 되면 값이 아니라 주소를 대입하게 되므로 sample1과 sample2는 같은 인스턴스를 참조하게 됩니다. 결과적으로 sample2에서 name을 변경하면 JVM Heap 영역 해당 주소에 있는 데이터의 name을 변경하게 되는 결과를 가져오고 sample1의 값도 변경이 됩니다. 이러한 방식을 얕은 복사라고 합니다.
참고자료
- Java의 정석
- 스프링 입문을 위한 자바 객체 지향의 원리와 이해
'Language > Java' 카테고리의 다른 글
[Java] Optional (0) | 2021.10.29 |
---|---|
[Java] 연산자 ( Operator ) (0) | 2021.10.23 |
[Java] SOLID (0) | 2021.09.29 |
[Java] 객체 지향 언어 (0) | 2021.09.29 |
[Java] 제네릭 (Generic) (0) | 2021.04.21 |
댓글