1. 얕은 복사 & 깊은 복사
얕은 복사
arr2의 값을 수정하면 arr1에 영향
배열의 참조(주솟값)만 복사한 것으로 arr1, arr2 모두 하나의 참조를 가리킴
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = arr1;
깊은 복사
배열을 그대로 가져와 새로운 배열을 만들어, 각각 수정해도 영향 없음
2. Object.clone()
자바의 모든 부모 클래스인 Object 클래스에 구현되어있는 clone()메서드 사용
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = arr1.clone();
3. System.arraycopy()
System.arraycopy(원본 배열, 복사시작위치, 복사할 배열, 붙여넣기 시작위치, 복사할 길이);
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = new int[3];
int arr3[] = {99, 98, 97, 96, 95};
System.arraycopy(arr1, 1, arr2, 0, 2); // int arr2[] = {2, 3};
System.arraycopy(arr1, 1, arr3, 2, 3); // int arr3[] = {99, 98, 2, 3, 4};
4. Arrays.copyOf()
Arrays.copyOf(원본 배열, 복사할 길이);
5. Arrays.copyOfRange()
Arrays.copyOfRange(원본 배열, 시작위치, 복사할 길이_끝낼 위치+1);
- if, 원본 배열의 길이 < 복사받아 만들어질 배열의 길이 :
- 초과하는 범위에 배열 타입의 default 값이 들어감(int - 0, String - null 등)
- if, 원본 배열의 길이 < 복사를 시작할 위치 :
- exception 발생
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = Arrays.copyOf(arr1,5); // int arr2[] = {1, 2, 3, 4, 5};
int arr3[] = Arrays.copyOfRange(arr1,0,3); // int arr3[] = {1, 2, 3};
int arr4[] = Arrays.copyOfRange(arr1,0,7); // int arr4[] = {1, 2, 3, 4, 5, 0, 0};
6. 2차원배열 복사
- Object.clone() 으로 2차원 배열을 복사할 수는 있지만 얕은 복사가 되기 때문에 주의!
- 2중 for문이나 for문 안에 위의 메서드들을 사용하면 깊은 복사 가능.
int arr1[][] = {{1,2,3},{4,5,6},{7,8,9}};
int arr2[][] = new int[arr1.length][arr1[0].length];
for(int i=0; i<arr2.length; i++){
System.arraycopy(arr1[i], 0, arr2[i], 0, arr1[0].length);
}
참고 사이트 :
https://seeminglyjs.tistory.com/215
https://romcanrom.tistory.com/48
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gglee0127&logNo=221353415984
'공부 > Java' 카테고리의 다른 글
[Java]size(),length,length(),capacity() 차이 (0) | 2023.02.08 |
---|---|
[Java]자바의 정렬 라이브러리 Arrays.sort() / Collections.sort() / List.sort() 비교 정리 (0) | 2023.01.05 |
[Java]Comparable / Comparator 인터페이스 특징과 차이 정리 (0) | 2023.01.05 |
[Java]Java의 시간 다루기 (0) | 2022.09.04 |
[Java] DFS/BFS 탐색 알고리즘 (0) | 2022.02.08 |
댓글