goal
배열의 복사와 다양한 배열의 복사 방법에 대해서 이해한다.
요약
개념 | 설명 |
얕은 복사 (Shallow copy) |
얕은 복사가 된 경우, 원본배열 또는 복사된 배열의 값이 변경된다면 영향을 준다. - 영향이란, 같은 메모리를 가리키고 있다는 말이다. - 같은 메모리를 공유한다는 의미 |
깊은 복사 (Deep copy) |
깊은 복사가 된 경우, 원본배열 또는 복사된 배열의 값이 변경이 있더라도 영향이 x - 각각 독립적인 메모리를 가진다. |
얕은 복사와 깊은 복사를 알아야 하는 이유 | 기본타입(primitive type)의 변수 경우, 얕은 복사로도 사용이 가능하지만 참조타입(reference type)의 변수인 경우 깊은 복사를 사용해야 객체의 실제 데이터를 복사할 수 있다. |
내용 | 설명 |
import java.util.Arrays Arrays.copyOf(원본배열, 복사할 길이) |
깊은 배열의 복사 |
import java.util.Arrays Arrays.copyOfRange(원본 배열, 복사할 시작 인덱스, 복사할 끝 인덱스) |
깊은 배열의 복사 |
* 배열의 복사 : 얕은 복사, 깊은 복사
개념 | 설명 |
얕은 복사 (Shallow copy) |
얕은 복사가 된 경우, 원본배열 또는 복사된 배열의 값이 변경된다면 영향을 준다. - 영향이란, 같은 메모리를 가리키고 있다는 말이다.(주소값 복사) - 같은 메모리를 공유한다는 의미 |
깊은 복사 (Deep copy) |
깊은 복사가 된 경우, 원본배열 또는 복사된 배열의 값이 변경이 있더라도 영향이 x - 각각 독립적인 메모리를 가진다. (복사된 실제값을 다른 메모리에 할당) |
얕은 복사와 깊은 복사를 알아야 하는 이유 | 기본타입(primitive type)의 변수 경우, 얕은 복사로도 사용이 가능하지만 참조타입(reference type)의 변수인 경우 깊은 복사를 사용해야 객체의 실제 데이터를 복사할 수 있다. |
1. 얕은 복사 (Shallow copy)
- ShallowCopy.java
import java.util.Arrays;
public class ShallowCopy {
public static void main(String[] args) {
int[] arr = new int[] {10,20,30,40,50};
int[] shallow_copy = arr;
System.out.println("* 변수가 가리키는 메모리 : " + arr + " " + shallow_copy);
System.out.println("\n");
System.out.println("1. shallow_copy만 진행");
System.out.println("----------------------------------------");
System.out.println("arr의 요소 : " + Arrays.toString(arr));
System.out.println("shallow_copy의 요소 : " + Arrays.toString(shallow_copy));
shallow_copy[0] = 100;
System.out.println("\n\n\n");
System.out.println("2. shallow_copy가 진행된 배열의 값 변경 (arr의 값이 변경되도 아래 결과는 동일하다.)");
System.out.println("----------------------------------------");
System.out.println("arr의 요소 : " + Arrays.toString(arr));
System.out.println("shallow_copy의 요소 : " + Arrays.toString(shallow_copy));
}
}
- ShallowCopy.java [출력값]
2. 깊은복사 (Deep copy)
[1] 종류
- Arrays.copyOf(원본배열, 복사할 길이)
- Arrays.copyOfRange(원본 배열, 복사할 시작 인덱스, 복사할 끝 인덱스)
1. Arrays.copyOf(원본배열, 복사할 길이)
- ArrayscopyOf.java
import java.util.Arrays;
public class ArrayscopyOf {
public static void main(String[] args) {
int[] arr = new int[] {10,20,30,40,50};
int[] deep_copy = Arrays.copyOf(arr, arr.length);
System.out.println("* 변수가 가리키는 메모리 : " + arr + " " + deep_copy);
System.out.println("\n");
System.out.println("1. deep_copy만 진행");
System.out.println("----------------------------------------");
System.out.println("arr의 요소 : " + Arrays.toString(arr));
System.out.println("deep_copy의 요소 : " + Arrays.toString(deep_copy));
deep_copy[0] = 100;
System.out.println("\n\n\n");
System.out.println("2. deep_copy가 진행된 배열의 값 변경 (arr의 값이 변경되도 아래 결과는 동일하다.)");
System.out.println("----------------------------------------");
System.out.println("arr의 요소 : " + Arrays.toString(arr));
System.out.println("deep_copy의 요소 : " + Arrays.toString(deep_copy));
}
}
- ArrayscopyOf.java [출력값]
2. Arrays.copyOfRange(원본 배열, 복사할 시작 인덱스, 복사할 끝 인덱스)
- ArrayscopyOfRang.java
import java.util.Arrays;
public class ArrayscopyOfRang {
public static void main(String[] args) {
int[] arr = new int[] {10,20,30,40,50};
int[] deep_copy = Arrays.copyOfRange(arr, 0, 3);
System.out.println("* 변수가 가리키는 메모리 : " + arr + " " + deep_copy);
System.out.println("\n");
System.out.println("1. deep_copy만 진행");
System.out.println("----------------------------------------");
System.out.println("arr의 요소 : " + Arrays.toString(arr));
System.out.println("deep_copy의 요소 : " + Arrays.toString(deep_copy));
deep_copy[0] = 100;
System.out.println("\n\n\n");
System.out.println("2. deep_copy가 진행된 배열의 값 변경 (arr의 값이 변경되도 아래 결과는 동일하다.)");
System.out.println("----------------------------------------");
System.out.println("arr의 요소 : " + Arrays.toString(arr));
System.out.println("deep_copy의 요소 : " + Arrays.toString(deep_copy));
}
}
- ArrayscopyOfRang.java [출력값]
'Java > java' 카테고리의 다른 글
java :) 문자열의 문자 변경, replace() & replaceAll() 메소드 설명 ( + 정규표현식 [외부자료]) (0) | 2022.05.09 |
---|---|
java :) System.arraycopy(), 매개변수가 5개가 들어가?(원본배열, 원본의복사시작점, 복사받을 배열, 복사받을 시작점, 복사받을 끝점) (0) | 2022.05.09 |
java :) Arrays.toString으로 배열 간편하게 출력하기 ( + 출력할 때 괄호 없애는 방법) (0) | 2022.05.09 |
java :) StringBuilder, StringBuffer의 개념과 사용의 이해 (0) | 2022.05.04 |
java :) Arrays의 다양한 메소드 정리하기 (0) | 2022.04.23 |