JavaBookStudy / JavaBook

책읽기 스터디
https://javabookstudy.github.io/
Apache License 2.0
19 stars 2 forks source link

[Effective Java] Item 48. 참조 지역성 #31

Closed jth2747 closed 3 years ago

jth2747 commented 3 years ago

p. 293의 6번째 줄에서,

참조 지역성이 가장 뛰어난 자료구조는 기본 타입의 배열이다. 기본 타입 배열에서는 (참조가 아닌) 데이터 자체가 메모리에 연속해서 저장되기 때문이다.

라고 나와있습니다. 참조 지역성이 뛰어나다는게 참조들이 메모리에 연속해서 저장되어 있다는 뜻인데, 제가 잘못 이해를 하는건지, 참조가 아닌 데이터가 메모리에 연속해서 저장되어서 참조 지역성이 뛰어나다는 게 무슨 말일까요..

daebalprime commented 3 years ago

이번 주는 개인사정 때문에 다 못읽고 들어갈 예정이지만...ㅜㅜ 참조 지역성이 'reference'가 지역성(오밀조밀하게 모여있다)을 만족한다가 아닌 실제 데이터에 접근할 때(참조) 그 데이터들이 지역성을 만족 한다라고 보시면 될 것 같습니다.

예를 들어서, int[] 배열과 임의의 클래스 배열을 생각해 보겠습니다. 각 배열의 베이스 주소가 0x1000, 0x2000이라고 가정합니다.

int 배열은 0x1000-> 정수 데이터 그자체 0x1004-> 정수 데이터 그자체 0x1008-> 정수 데이터 그자체 0x100B-> 정수 데이터 그자체 ... 반복

그래서 int 배열의 숫자들을 탐색(참조)하려면 0x1000~배열의 범위까지(데이터가 흩어지지 않고 모여있으므로 지역성) 읽어들이면 됩니다. 참조 지역성이 뛰어난 경우입니다. int, long, char, float 등 기본 타입형이 여기에 해당합니다.

기본 타입형을 제외한 임의의 class 배열의 경우에는, 각 배열의 element에는 클래스 인스턴스의 주소가 들어가게 될 것입니다. 0x2000-> 0x1f380 (클래스의 인스턴스 1) 0x2008-> 0x2c050 (클래스 인스턴스 2) ... 반복

배열 elem의 인스턴스 주소는 JVM의 메모리 할당기의 정책, 할당하는 시점, 멀티쓰레드 프로그램 여부 등에 따라 모여있을 수도, 흩어져 있을 수도 있습니다. 그래서 만약 해당 배열의 모든 인스턴스를 순회하고자 할 경우에는, 정수 배열에 비해 넓은 범위를 sparse하게 탐색하게 됩니다. (참조 지역성 낮음)