JVM과 메모리에 대해서 다루기 전에, 또한 GC에 대해 알기 전에, Java의 자료형에 대해 알아야 할 필요가 있다고 생각해 정리해보고자 합니다.
자료형의 종류
자바는 크게 기본 자료형(Primitive Type)과 참조 자료형(Reference Type)라는 2개의 자료형을 가집니다.
- 기본 자료형은 8가지(byte, boolean, char, int, short, long, float, double)가 있습니다.
- 그리고 위 8가지를 제외한 나머지는 모두 참조 자료형입니다.
- 또한 참조 자료형은 사용자가 직접 정의한 커스텀 자료형 또한 포함됩니다.
먼저 기본 자료형에 대해 간단하게 알아보겠습니다.
기본 자료형
기본 자료형에는 8가지가 존재합니다.
- 참, 거짓을 저장하는 boolean
- 실수를 저장하는 float, double
- 문자(정수)를 저장하는 char
- 정수를 저장하는 byte, int, short, long
위와 같이 모든 기본 자료형은 소문자로 시작하는 것을 확인할 수 있습니다.
또한 기본 자료형은 null 값을 가질 수 없습니다.
가만 보면, 정수를 저장하는 자료형이 4개나 됩니다. 왜 이렇게 많을까요?
이는 메모리의 효율성을 위해서인데, 다음 2가지 경우를 예를 들어보면 이해가 쉬울 것 같습니다.
- 큰 공간을 가진 자료형만 존재한다면, 작은 공간을 필요로 하는 변수를 저장할 때 그 공간의 차이만큼 낭비가 발생합니다.
- 반대로 작은 공간을 가진 자료형만 존재한다면, 큰 공간을 필요로 하는 변수를 저장할 때 공간이 부족해집니다.
(여기서 말하는 공간이란, 곧 메모리를 의미할 것입니다.)
따라서, 여러 종류의 공간을 가진 자료형을 두어, 효율적인 메모리 사용이 가능하도록 합니다.
char이 문자(정수)를 저장하는 자료형이라고 하는 이유는 무엇일까요?
자료형은 곧 메모리라고 할 수 있습니다. 메모리는 2진수 값만 저장할 수 있는 공간입니다.
그렇다면 자료형에 문자를 저장할 수 없을 겁니다.
따라서 char은 모든 문자를 특정 정숫값으로 바꿔 저장합니다. 그리고 이 정숫값을 유니 코드라고 합니다.
참조 자료형
원시 자료형으로 불리는 기본 자료형을 제외한 자료형으로, 비 원시 자료형이라고도 불립니다.
데이터 값을 그대로 저장하는 기본 자료형과는 다르게 참조 자료형은 메모리 상에서 데이터가 저장된 주소,
즉 참조값을 저장하기 때문에 참조 자료형이라는 이름이 붙게 되었습니다.
대표적으로는 다음과 같은 자료형들이 있고, 이들은 각각 빈 객체를 의미하는 null 값을 가질 수 있습니다.
- Array
- Class
- Interface
- String
- System
자료형의 저장 방식
이와 같이 자료형을 구분하는 이유는, 기본 자료형과 참조 자료형의 값 저장 방식이 서로 다르기 때문입니다.
그럼 저장방식이 어떻게 다른지 알아봐야 하는데, 우선 메모리의 구조부터 알아보고 넘어가겠습니다.
메모리 구조
Stack Area | Heap Area |
자바는 메모리를 여러 영역으로 나눠 사용하는데,
이 중 자료형의 구분을 이해하는데 필요한 2가지 영역을 가져왔습니다.
Stack Area
기본형 변수와 참조형 변수가 생성되거나 소멸되는 영역입니다.
Heap Area
new 키워드로 생성된 참조형 변수들의 실제 값(데이터)가 생성되는 영역입니다.
저장 방식
먼저 기본 자료형은, 스택 영역에 먼저 자료형의 공간을 확보하고, 실제 값(데이터)이 바로 저장됩니다.
이와 다르게 참조 자료형은, 스택 영역에 먼저 자료형의 공간을 확보하고, 힙 영역에 새로운 공간을 확보해 실제 값을 저장합니다. 그리고 힙 영역의 주소값을 불러와 스택 영역에 있는 자료형의 값으로 저장합니다.
따라서, 위에 메모리 구조 설명에서, 두 자료형의 변수 모두 스택 영역에 저장되는 것은 동일하지만, 그 의미는 다릅니다.
- 기본 자료형은 스택 영역에 저장된 변수에 실제 값이 존재하기에, 해당 변수의 값을 사용하려면 스택 영역까지만 접근하면 사용할 수 있습니다.
- 참조 자료형은 스택 영역에 저장된 변수에 있는 주소값으로 힙 영역으로 접근해 실제 값을 사용할 수 있습니다.
이후의 이야기
이렇게 자바에서의 두 자료형에 대해 알아보았습니다.
그런데 메모리 구조 부분에서,
"Stack Area는 변수의 생성과 소멸이 일어나는 영역"이라고 했습니다. 그렇다면 생성과 소멸이 어떻게 발생할까요?
Stack Area에 있는 변수들은 Scope를 가집니다. 이 Scope는 변수의 생성부터 소멸 시점을 나타내는 일종의 정보이고, 이에 따라 변수의 생성과 소멸이 발생합니다.
(예를 들어, 함수 내의 지역 변수인 경우, 해당 함수의 호출이 끝나면 함수 내의 지역 변수들은 모두 소멸)
그렇다면 이제 힙 영역에 대한 설명을 보면,
"Heap Area는 new 키워드로 생성된 참조형 변수들의 실제 값(데이터)가 생성되는 영역"이라고 합니다. 소멸에 대한 얘기가 빠져있습니다.
Heap Area에 있는 데이터의 소멸이 발생하지 않는다면, 무자비한 코드로 인해 Heap Area를 가득 채워 비정상적인 동작을 수행하게 될 수도 있을 겁니다.
그럼 Heap Area에 있는 데이터에 대한 소멸 또한 필요할텐데 이는 어떻게 수행되는 것일까요?
바로 Garbage Collector라는 멋진 친구가 이를 담당합니다. 이는 다음 포스트에서 자세하게 다뤄보겠습니다!
출처
- JVM 메모리 구조와 참조 자료형 : https://velog.io/@heitzes/JAVA-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%B0%B8%EC%A1%B0-%EC%9E%90%EB%A3%8C%ED%98%95
- Method Area와 JVM Stack, Heap 메모리의 구조와 용도 : https://hanna97.tistory.com/entry/Method-Area%EC%99%80-JVM-Stack-Heap-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%9D%98-%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%9A%A9%EB%8F%84
- Primitive type & Reference type : https://gyoogle.dev/blog/computer-language/Java/Primitive%20type%20&%20Reference%20type.html
'Java지식' 카테고리의 다른 글
Java의 effectively final이란? (3) | 2023.06.10 |
---|---|
Overloading과 Overriding (1) | 2022.09.19 |
절차적 프로그래밍과 객체 지향 프로그래밍 (1) | 2022.08.22 |