- 얕은 복사
- 앞서 설명드린것처럼 배열은 참조형 변수이며 실제값이 아닌 실제값의 주소값을 가진다고 했던거 기억하시죠?
- 따라서 배열 변수간에 대입 연산자 = 를 사용해서 복사를 하게 되면 주소값만 복사됩니다.
- 이렇게 주소값만 복사되고 실제값은 1개로 유지되는걸 얕은 복사 라고 합니다!
- 주소값만 복사된다?
- 주소값만 복사된다는건 변수명은 서로 다르지만 같은 값을 보고 있다는것을 뜻해요.
- 비유하자면 내가 가진 핸드폰, PC 로 각각 카카오톡에 로그인해도 나의 카톡 계정은 1개인것처럼, 변수명은 여러개지만 결국 실제값은 1개인것과 같다고 보시면 됩니다.
// 얕은 복사
int[] a = { 1, 2, 3, 4 };
int[] b = a; // 얕은 복사
b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)
System.out.println(a[0]); // 출력 3 <- a 배열의 0번째 순번값도 3으로 조회됩니다.
- 깊은 복사
- 얕은 복사처럼 가짜 복사가 아니라 진짜 새로운 배열을 똑같이 만들고 싶을때 깊은 복사를 합니다.
- 깊은 복사는 결국 실제 값을 가지고 있는 배열의 기본형 값을 꺼내서 복사해주면 됩니다.
- 반복문 for 문 을 통해서 하나씩 꺼내서 복사해주는 방법과 여러 메서드를 사용하는 방법이 있습니다.
// 깊은 복사
int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = a[i]; // 깊은 복사
}
b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)
System.out.println(a[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로 입니다.
// 깊은 복사 메서드
// 1. clone() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone(); // 가장 간단한 방법입니다.
// 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다!!
// 깊은 복사 메서드
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 2. Arrays.copyOf() 메서드
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
}
}
'Java' 카테고리의 다른 글
컬렉션 및 예제 (0) | 2023.04.03 |
---|---|
2차원 배열과 3차원 배열 (0) | 2023.04.03 |
for문과 while, do-while (0) | 2023.04.03 |
비트연산자, 연산자 우선순위 (0) | 2023.04.03 |
삼항 연산자 (0) | 2023.04.03 |