Step-by-Step
[JAVA] 배열 복사 - 얕은 복사와 깊은 복사 본문
Java로 코딩 문제를 풀던 도중, 2차원 배열을 복사할 일이 생겼다
정확하게 복사하기 위해 구글에 검색해보던 도중, 배열의 복사에는 두 가지가 있다는 걸 알게 되었다
첫 번째는 배열의 주소값을 복사하는 얕은 복사(shallow copy),
두 번째는 배열의 값 자체를 복사하는 깊은 복사(Deep copy)
얕은 복사(Shallow Copy)
- 주소값을 복사하는 방식으로, 복사 후 한쪽에서 값을 변경하면 다른 쪽에서도 변경된다
- 두 배열이 같은 값을 참조하기 때문에 한쪽에서 바꾸면 다른 쪽 배열의 값도 바뀌게 된다
int[] a = {2,3,5};
int[] b = a;
System.out.println("b:"+b[0]+","+b[1]+","+b[2]);
b[1] = 100;
System.out.println("a:"+a[0]+","+a[1]+","+a[2]);
System.out.println("b:"+b[0]+","+b[1]+","+b[2]);
[결과]
그림으로 설명하면 다음과 같다
깊은 복사(Deep Copy)
사실 얕은 복사를 사용할 일도 있겠지만, 대부분의 경우 값 자체만 복사하려고 하는 경우가 대부분이다
가장 확실한 방법은 반복문을 돌려서 하나하나 복사하는 방법인데, 코드도 길어지고 효율성도 떨어진다
- 깊은 복사는 얕은 복사와 달리 새로운 메모리 공간에 값을 복사하는 것이기 때문에 다른 배열에 영향을 끼치지 않는다
1) 1차원 배열
- .clone() 메소드를 이용하여 깊은 복사를 진행하면 된다
int[] a = {2,3,5};
int[] b = a.clone();
System.out.println("b:"+b[0]+","+b[1]+","+b[2]);
b[1] = 100;
System.out.println("a:"+a[0]+","+a[1]+","+a[2]);
System.out.println("b:"+b[0]+","+b[1]+","+b[2]);
결과
그림으로 표현하면 다음과 같다
※ 단, 객체를 담고 있는 배열일 경우 for문을 돌려서 매번 객체 생성(new 사용)을 하여 값을 넣어주어야 함
2) 2차원 배열
2차원 배열도 마찬가지로 for문을 이용하여 단순하게 복사하는 방법이 있다
하지만 더욱 코드를 단순하게 하기 위해서는 System.arraycopy() 메소드를 이용하면 된다
int[][] a = {{1,2,3},{4,5,6}};
int[][] b = new int[a.length][a[0].length];
for(int i=0; i<b.length; i++) {
System.arraycopy(a[i], 0, b[i], 0, b[i].length);
}
b[0][1]=100;
b[1][2]=200;
결과
※ 2차원 배열도 마찬가지로 객체 배열을 복사할 경우, for 문을 이용하여 하나하나 복사해야한다
[참조]
'언어 > JAVA' 카테고리의 다른 글
[JAVA] 백준 - 주사위 굴리기 (0) | 2022.02.18 |
---|---|
[JAVA] 백준 - 2048(Easy) (0) | 2022.02.15 |
[JAVA] 백준 - 미로 탐색 [2178] (feat. DFS의 문제점) (0) | 2022.02.03 |
ArrayList 주의할 점 - Reference(주소 값) (0) | 2022.01.28 |
[JAVA] 프로그래머스 - 후보키 (feat. 이틀..) (0) | 2022.01.28 |