개발자 미니민의 개발스터디

[JAVA] 자바 - arraycopy (배열 복사)란 무엇? (예문)

by mini_min
[JAVA]
자바 - arraycopy

직관적으로 무슨 뜻인지 파악되는 '배열복사'...

 

✔️ 배열복사(arraycopy) 란?

System.arraycopy(list, 0, temp, 0, count);

◾ 어레이 카피는 A라는 배열의 0번째부터 B라는 다른 배열 0번째에 count 만큼 복사할 때 사용한다.

어레이 카피 인자가 오는 순서는 다음과 같음

 

(array1 , 0 , array2, 0 , count )

1번 배열의 0번째 값부터 2번 배열의 0번째 값에 count 갯수 만큼 복사

이때, 1번 배열과 2번 배열의 주소값은 다름! 서로 다른 배열임

 

 

 

✔️ 배열복사(arraycopy) 예문

public class Score { //학생들 정보 저장소
private ScoreVO[] list; //학생 정보를 넣을 배열
private int count; //학생 정보를 넣을 때 마다 카운트
public Score() { //Score 클래스 생성자
//count 초기값 0, allocation 메소드 (5값씩 할당할 것)
count = 0;
allocation(5);
}
private void allocation(int capacity) { //allocation 처음 용량 5
ScoreVO[] temp = new ScoreVO[capacity]; //temp 라는 학생 정보 배열 객체 선언(용량 5)
if(list != null && count >0) { //학생 배열이 null이 아니고(꽉찼고), 1명이상 저장되어있다면,
System.arraycopy(list, 0, temp, 0, count); //list 배열의 0번 값을 temp 배열의 0번째로 count(인원수)만큼 복사
}
list = temp; // temp 의 주소값을 list에 넘겨준다.
}
// list 배열 : list배열에 ScoreVO 객체를 저장
public int append(ScoreVO vo) { //잘 저장하다가 list 가 꽉 차는 상태 발생!!!
if(count >= list.length) { //list 배열 수보다 학생 수가 많으면 +5해줌
//그럼 temp 배열은 5->10개 배열이 되겠지?
allocation(count+5);
}
if(readScore(vo.getHak()) != null) { //학번이 존재하면 0값 출력
return 0;
}
list[count++] = vo; //용량 문제가 없으면 list에 학생 정보 삽입
return count;
}

◾ 참 복잡해보이는 코드....

핵심은 list에 ScoreVO 객체를 저장하다가 list 배열이 꽉 차는 경우가 생기면 allocation(count+5) 메소드를 실행하는 것! allocation 메소드에서 임시 temp 메소드를 만들고, list 배열에 null이 없이 꽉찬 상태일 때, arraycopy를 해준다.

list 배열의 값을 temp 배열로 복사한다.

이후, temp 배열 주소값을 list로 넘긴다. 즉, list 배열이 temp 배열의 주소값을 사용, temp 배열 그자체가 된다. 이후 temp 배열은 사용하지 않으니까 GC 대상이 되겠지!!

 

 

 

드디어 이해했다 코드...! !!!ㅠㅠㅠㅠ

 

 

 

블로그의 프로필 사진

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기