티스토리 뷰
배열의 정의와 특징 그리고 사용하는 방법만 알았을 뿐, 실제로 내부적으로 어떻게 동작하는지 생각해보지 않았었다.
그래서 배열이 선언되었을 때 어떻게 메모리에 할당되고 접근할 수 있는지에 대해 알아보려고 한다.
배열
같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여한 자료구조이다.
메모리는 연속적으로 생성되고, 같은 타입의 데이터만 저장할 수 있고, 한 번 선언한 배열의 크기를 변경할 수 없다.
배열의 메모리 구조
배열은 참조타입(Reference Type)으로 heap 영역에 할당되고, 배열을 참조하는 변수는 stack 영역에 할당된다.
stack 영역에 할당된 배열을 참조하는 변수는 heap 영역에 할당된 배열 객체의 주소를 참조한다.
배열은 heap 영역에 배열의 크기만큼 연속된 메모리 공간이 할당된다. 배열의 모든 요소가 메모리에서 인접하게 저장되어 있다는 것이다.
배열의 각 요소는 선언된 데이터 타입에 따라 고정된 크기를 갖는다. 위 그림은 나이를 저장한 int 타입의 배열인데, 각 요소는 4 byte의 크기를 차지한다.
메모리 접근 방식
배열의 메모리에 접근하는 방식에는 두 가지의 키워드가 중요하다.
1. 인덱스
배열은 인덱스(index)의 개념이 존재한다.
인덱스는 배열 요소에 접근, 위치 지정, 범위 확인 등 중요한 역할을 한다.
이 글에서 인덱스의 중요성은 배열 객체의 메모리 주소를 계산하는 데 기여한다는 것이다.
2. 데이터 타입의 크기
배열을 선언할 때 같은 타입으로만 정의할 수 있으며, 각 데이터 타입의 크기는 미리 정해져 있다. - 참고
JVM은 인덱스와 배열의 시작주소를 알고 있다.
위에서 언급한 것처럼, stack에 할당된 배열 변수는 heap에 할당된 배열 객체의 주소를 참조하고 있다고 했다.
정확하게 말하자면, 배열 객체의 첫 번째 요소(0번 인덱스 요소)의 주소를 참조하며 이는 배열의 시작주소이다.
배열의 다른 요소에 접근하려면 JVM은 다음과 같은 수식을 통해 주소를 계산한다.
주소 = 배열의 시작주소 + (인덱스 * 데이터 타입 크기)
이러한 방식을 기반으로 메모리에 접근하기 때문에, 배열의 요소에 접근할 때 O(1)이라는 시간복잡도로 빠르게 접근할 수 있는 것이다.
그럼 첫번째 그림에서 다른 요소의 주소 값을 다음과 같이 채워놓을 수 있다.
배열에서 메모리를 가져오는 원리를 정리한다.
1. (배열 선언) 크기와 타입을 설정하여 배열 객체를 선언한다.
2. (메모리 할당) heap 영역에 배열의 크기만큼 연속적인 메모리가 할당되며, stack 영역에 배열을 참조하는 변수가 배열의 시작 주소를 가지고 할당된다.
3. (인덱스와 타입크기 기반 접근) JVM은 배열의 시작주소, 인덱스 그리고 데이터 타입 크기를 활용하여 배열의 메모리 주소를 계산하여 접근한다.
동작하는 원리를 알면 정의를 외우고 있을 필요가 없다는 걸 알게되었다.
다음엔 메모리에 할당된 데이터들이 어떻게 해제되는지 알아봐야겠다.
2024.11.13 - [Language/Java] - 메모리 관리: Generational Garbage Collection
'Language > Java' 카테고리의 다른 글
클래스 (0) | 2024.10.17 |
---|---|
이넘(Enum) (0) | 2024.10.16 |
[Java] Collection Framework (0) | 2022.11.27 |
[Java] Exception (0) | 2022.11.10 |
[Java] Thread (0) | 2022.06.28 |
- Total
- Today
- Yesterday
- spring boot
- JPA
- fail-safe
- syncronized
- 다중화
- 정적변수
- Hash
- 로드 밸런서
- 자동구성
- Caching
- 티스토리챌린지
- 고정 세션
- Spring
- @conditional
- Sticky Session
- nosql
- Red-Black Tree
- 추상클래스
- 인터페이스
- nginx
- HashSet
- Load Balancer
- 오블완
- fail-fast
- Security
- 인스턴스변수
- object
- HashMap
- AutoConfiguration
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |