Java는 데이터를 어떻게 표현하는가
Java는 크게 두 가지 Data Type을 사용한다.
- Primitive
- Reference (Object)
Primitive Type와 Reference Type이 어떻게 다른지를 이해하기 위해서는
이 타입들이 컴퓨터 메모리에서 어떻게 존재하는지를 이해해야 한다.
Primitive Type은 ?
int i = 42;
float pi = 3.14;
boolean b = true;
i 라는 int 변수 하나가 만들어져 있다. 이 변수는 메모리 상 어딘가에 42라는 값이 저장이 된다.
우리는 i라는 변수를 사용하면 메모리에서 42라는 값을 꺼내와서 사용할 수 있다.
pi 라는 float 변수와 b 라는 boolean 변수도 동일하게 pi 나 b 라는 변수를 사용하여 메모리 상의 어딘가에 존재하고 있는 값 3.14, true를 꺼내와 사용한다.
Reference Type은 ?
String s = "Hello";
Reference Type의 변수 s 안에 "Hello"라고 하는 문자열을 넣었다.
s 변수는 메모리 상의 어느 곳을 지칭하게 되고 지칭한 주소에는 "Hello" 문자열이 들어 있는 것이 아니라 "Hello" 문자열이 있는 곳의 Reference 주소를 가지고 있다.
메모리 위치에 실제 값이 들어 있는 것이 아니라 변수가 가리키는 메모리 위치에 Reference 주소만 담겨 있고 그 주소가 가리키고 있는 실제 메모리의 위치에 접근해봐야 데이터가 담겨있다.
Ex)
A a = new A(); // 1
a = new A(); // 2
A b = a; // 3
// 1
먼저 A라는 클래스를 생성했다. 변수 a라는 곳에 A 클래스를 담았다.
변수 a는 메모리 상의 어딘가를 가리키게 되고 그곳에는 Reference 주소가 담긴다.
여기서 Reference 주소는 A 오브젝트가 있는 그 주소를 레퍼런싱 하고 있다.
// 2
다음으로 같은 변수 a 를 만들어서 새로운 인스턴스 A를 만들어 덮어 씌었다. 그렇다면 새로운 A 인스턴스가 메모리 상 어딘가에 생겨나게 되고 Reference 주소는 새로 생겨난 인스턴스를 가리키게 된다.
// 3
변수 b 를 만들어서 변수 a를 대입한다. 이렇게 되면 변수 a에 담겨있는 Reference 주소를 변수 b도 갖게 되어 변수 a와 변수 b는 동일한 인스턴스를 가리키게 된다. 즉, b와 a는 같은 오브젝트를 가리키고 있기 때문에 두 변수 중에서 어떤 변수를 사용하여 A오브젝트를 조작하건 똑같은 결과를 나타낼 수 있다.
Ex)
String s = "A"; // 1
s += "B"; // 2
s += "C"; // 3
String 변수는 immutable 하다.
즉, Java 에서 String은 한 번 만들어지면 변경되지 않는다.
// 1
s 변수에 "A"를 담아 변수를 생성한다.
// 2
기존 s 변수에 "B"를 더하는 것이 아니라 "A"를 버리고 새로운 "AB"를 만들어낸다.
// 3
동일하게 변수 s는 "A", "AB"를 버리고 새로운 "ABC" 만들어 가리킨다.
'Algorithm & Data Structure > study' 카테고리의 다른 글
[Data Structure / Java] ✒️ Stack, Queue (0) | 2022.08.15 |
---|---|
[Data Structure / Java] ✒️ Map (2) | 2022.08.12 |
[Data Structure / Java] ✒️ ArrayList와 LinkedList의 차이 (0) | 2022.08.08 |
[Data Structure / Java] ✒️ 시간 복잡도 (0) | 2022.08.04 |
[Data Structure / Java] ✒️ Call By Value / Call By Reference (1) | 2022.08.04 |