Study

[JAVA/자바] 배열 (Array) - 선언 / 할당 / 초기화 / 복사

_유니 2022. 10. 28. 13:44

 

배열

같은 자료형의 변수를 하나의 묶음으로 다루는 것
배열은 저장된 값마다 인덱스 번호가 0부터 시작하여 설정


* 변수는 하나의 공간에 하나의 값을 담을 수 있고,
배열은 하나의 공간에 여러 개의 값을 담을 수 있다

* "같은 자료형의 값"으로만 담을 수 있다

* 배열의 각 인덱스 자리에 실제 값이 담김

* 반복문 활용 가능

- 배열 선언

[표현법]
자료형 배열명[];
자료형[] 배열명; // 일반적으로 이걸 많이 씀

ex) int[] arr;
* int 값만 담을 수 있음

- 배열 할당 (크기 지정)

[표현법]
배열명 = new 자료형[배열크기];

ex) arr = new int[3];

- 배열 선언과 동시에 할당

[표현법]
자료형[] 배열명 = new 자료형[배열크기]

ex) int[] arr = new int[3];

- 배열 선언, 할당, 초기화 동시에 하기

ex) int[] arr1 = new int[]; {1,2,3,4}
int[] arr2 = {1,2,3,4}

* System.out.println(arr1 == arr2); // false
각각의 변수의 담겨있는 주소 값을 비교하기 때문에 false
* System.out.println(arr1[1] == arr2[1]); // true
각각의 변수의 인덱스 값을 비교하기 때문에 true

- 배열 저장구조

배열은 참조 변수로 Stack 영역에 할당되며 배열 공간의 주소를 저장
배열 공간의 주소를 이용해 인덱스를 참조하는 방식으로 값 처리

* 실제 리터럴 값을 곧바로 담을 수 있는 변수는 일반 변수라고 하고
주소 값을 담고 있는 변수는 참조 변수(레퍼런스 변수)라고 한다
(String, int[], double[], char[], short[], 등등)

내가 그림 ㅎ


* Heap 공간은 절대 빈 공간으로 존재할 수 없다
공간이 만들어질 때 JVM이 기본적으로 초기화(대입)를 진행해줌
=> 각 인덱스에 초기화를 하지 않아도 값들이 담겨있다

* 연결이 끊어진 기본 배열은 Heap 공간에 남아있음
=> 일정 시간이 지나면 가비지컬렉터(GC)가 지워줌

* 배열을 강제로 삭제 키시고자 한다면
arr = null;

 

- 배열 복사

 

- 얕은 복사

객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하는 것

=> 주소 값이 같다

 

 

- 깊은 복사

새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것

=> 각자 다른 배열 참조하고 있기 때문에 주소 값이 다름

      즉, 배열 수정 시 서로에게 영향을 주지 않는다

 

1) for문을 활용한 복사

새로운 배열을 생성한 후 반복문을 활용해서 원본 배열의 갑들을 새로 만든 배열에 대입한다.

int[] origin = {1, 2, 3, 4, 5}

int[] copy = new int[5];

for (int i = 0; i < copy.length; i++) {
		copy[i] = origin[i];
}

 

2) arraycopy() 메소드를 이용한 복사

System.arraycopy(원본 배열명, 복사 시작할 인덱스, 복사본 배열명, 복사본 배열의 복사 시작 인덱스, 복사할 개수);

int[] origin = {1, 2, 3, 4, 5};

int[] copy = new int[10]; // 넉넉하게 크게 생성 / 0~9 인덱스까지 0이 담겨있음

System.arraycopy (origin, 1, copy, 3, 3);

 

3) copyOf() 메소드를 이용한 복사

복사본 배열 = Arrays.copyOf(원본 배열명, 복사할 길이);

* 내가 제시한 길이만큼 복사본 배열 크기 할당

 단, 내가 제시한 길이가 원본 배열의 크기보다 클 경우 기존의 배열에 있는 값은 다 복사, 나머지는 0으로 채운다.

      내가 제시한 길이가 원본 배열의 크기보다 작을 경우 기존의 배열에 있는 값을 내가 제시한 길이만큼만 복사한다.

int[] origin = {1, 2, 3, 4, 5};

int[] copy = Arrays.copyOf(origin, 10);

 

4) clone() 메소드를 이용한 복사

복사본 배열 = 원본배열.clone();

* 인덱스 지정 불가, 크기 지정 별도로 못함

int[] origin = {1, 2, 3, 4, 5};

int[] copy = origin.clone();