자바에는 동적인 배열을 제공하는 클래스들이 여러가지가 존재한다. 제일 흔하게 볼 수 있는 것이 ArrayList 이다.
ArrayList를 예로들어 자바의 동적인 배열에 대해 설명하도록 하겠다.
자바에서는 동적으로 메모리 공간을 할당하지 못한다. 간단히 자바의 모든 배열은
int list[] = new int[10];
위의 코드처럼 무조건 초기화를 통해 배열의 크기를 지정하여 사용하여야 한다.
근데 개발자 입장에서 위의 배열의 크기를 그때 그때 바꾸고 싶은 경우가 많을 것이다.
그래서 많은 개발자들이 ArrayList를 사용할 것이다. 그런데 자바는 동적인 배열을 제공하지 않는다.
그럼 ArrayList는 어떤 원리로 동적은 메모리 공간을 지원하는지 생각을 해보았는가??
그 원리를 들여다보면 너무나 간단하다. 이 원리를 이용하면 구지 ArrayList를 사용하지 않아도 간단한 동적배열을
생성하여 사용할 수 있다.
ArrayList 의 원문소스를 들여다보면 데이터를 저장하는 공간으로 다음과 같은 배열을 사용한다.
private transient E[] elementData;
그냥 단순한 배열을 사용한다는 것을 알 수 있다. ArrayList의 Method 중에서 add(Object o)라는 살펴보면
다음과 같은 원리로 동적배열을 제공하고 있다.
Object oldData[] = elementData;
elementData = (E[])new Object[newCapacity];
System.arraycopy(oldData, 0, elementData, 0, size);
add() 함수에서 보면 자바에서는 동적인 배열을 처리하기위해 새로운 배열을 생성하여 arraycopy를 통하여
기존의 데이터를 새로운 배열에 저장하여 배열의 크기가 동적으로 변경된 것처럼 보여지도록 하고있다.
그리고 한가지 더 설명하자면 배열이 동적으로 크기가 변할때마다 새로운 배열을 생성하는 작업이 발생하는 것을
방지하기 위해 임의로 사용자가 사용하고 있는 배열보다 더 큰 크기의 배열을 생성하여 버퍼공간을 가지도록
새로운 배열을 생성하여 사용한다.
'프로그래밍 언어 (プログラミング言語) > JAVA' 카테고리의 다른 글
JAVA에는 unsigned 자료형이 존재하지 않는다!! 단..... (0) | 2023.02.15 |
---|---|
체크 예외 vs 언체크 예외(런타임 예외) (0) | 2023.01.22 |
자바에서 메모리를 절약하는 방법!! (0) | 2023.01.18 |
JAVA - 프로그래머는 객체 삭제가 불가능하다!!! 속지말자!!! (0) | 2023.01.18 |
Vector vs ArrayList vs Linkedlist의 차이점!!! (0) | 2023.01.17 |