Java

[Java] 배열과 배열의 복사

seonggu 2022. 12. 22. 10:30

1️⃣ 배열(array)

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것.

많은 양의 데이터를 저장하기 위해서, 그 데이터의 숫자만큼 변수를 선언해야 한다면 엄청 번거로워진다.

해서 배열을 사용하면 많은 양의 데이터를 저장하고 쉽게 사용할 수 있다.

선언방법 예시
타입[] 변수이름; int[] num;
String[] name;
타입 변수이름[]; int num[];
String name[];

위와 같이 배열을 선언할 수 있는데 변수 또는 타입에 배열을 의미하는 대괄호[]를 붙이면 된다. 하지만 대부분 타입 쪽에 붙이는 방법을 선호한다(예 : int[])

타입[] 변수이름;
변수이름 = new 타입[];

int[] num; // 1
num = new int[3]; // 2

int[] num = new int[3]; //선언과 동시에 생성하기.

✅ 선언은 단지 생성된 배열을 다루기 위한 참조 변수를 위한 공간만 만드는 것이고,

배열을 2번처럼 배열을 생성해야지 값을 저장할 수 있는 공간이 만들어진다. 

그래서 위와 같이 보통 선언과 생성을 같이하여서 간략히 한 줄로 사용한다.

 

✅ 배열의 인덱스(index)

생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 하고 배열이름[인덱스] 의 형식으로 배열의 요소에 접근한다.

인덱스는 배열의 요소마다 붙여진 일련번호이다. 각 요소를 구별하는 데 사용되며 인덱스는 1이 아닌 0부터 시작한다.

배열의 인덱스 범위 : 0부터 배열길이-1까지이다.

2️⃣ 배열(array)의 복사

배열을 생성하면 그 길이를 변경할 수 없다. 해서 기존 배열의 공간보다 저장공간이 더 필요하다면 큰 배열을 새로 생성하고 이전 배열로부터 내용을 복사해야 한다. 배열을 복사하는 방법은 두 가지가 있다.

 


1. 먼저 for문을 이용해서 배열을 복사하는 방법은 다음과 같다.

int[] num = new int[5]; //선언과 생성

int[] tmp = new int[num.length*2]; // 기존 num 배열보다 길이 2배인 배열 tmp 생성

for(int i=0; i < num.length; i++) 
	tmp[i] = num[i]; // for문을 이용해서 기존 요소들을 새 배열에 넣기

num = tmp; // 참조변수 num이 새로운 배열을 가리키게 하기

처음부터 배열을 길이를 넉넉하게 잡아줘서 새로 배열을 생성해야 하는 상황을 가능하면 없도록 해야 한다. 그렇다고 너무 배열의 크기를 크게 생성하면 메모리를 낭비하게 되므로, 위 코드처럼 기존의 2배 정도의 길이로 배열을 생성하는 것이 좋다. 

1) 참조변수 num과 tmp는 같은 배열을 가리키게 된다. 배열 num과 배열 tmp는 이름만 다를 뿐 동일한 배열이다. 
따라서, 전에 가리키던 배열 num은 더 이상 사용할 수 없게 된다.
2) 배열은 참조 변수를 통해서만 접근할 수 있기 때문에, 자신을 가리키는 참조변수가 없는 배열은 사용할 수 없다.
쓸모가 없게 된 배열은 JVM의 가비지 컬렉터(GC)에 의해서 자동적으로 메모리에서 제거된다.

 

 

2.  System.arraycopy()를 이용한 배열을 복사하는 방법은 다음과 같다.

for문 대신 System클래스의 arraycopy()를 사용하면 간단하고 빠르게 배열을 복사할 수 있다. for문은 배열의 요소를 하나하나 접근해서 복사하지만, arraycopy()는 지정된 범위의 값들을 한 번에 통째로 복사한다. 각 요소들이 연속적으로 저장이 되어있다는 배열의 특성 때문에 가능하다.

앞선 for문보다 System.arraycopy()를 사용하는 것이 효율적임.
for(int i=0; i<num.length; i++)
	newNum[i] = num[i]; //기존 for문으로 복사
   
System.arraycopy(num, 0, newNun, 0, num.length); //arraycopy를 이용한 복사.

arraycopy()를 호출할 때는 어느 배열의 몇 번째 요소에서 어느 배열로 몇 번째 요소로 몇 개의 값을 복사할 것인지 지정해줘야 한다. 따라서,

위 코드는 num[0]에서 newNum[0]으로 num.length개의 데이터를 복사함.

복사하려는 배열의 위치가 적절하지 못해서 복사하려는 내용보다 여유공간이 적을 경우.
ArrayIndexOutOfBoundsException 에러가 발생한다.

 

 

 

참고자료 -

더보기

자바의 정석 3판 

 

image -

https://www.flaticon.com/kr/free-icon/boxes_2250334?term=%EB%B0%95%EC%8A%A4&page=1&position=1&origin=search&related_id=2250334