Step-by-Step

[JAVA] 배열 복사 - 얕은 복사와 깊은 복사 본문

언어/JAVA

[JAVA] 배열 복사 - 얕은 복사와 깊은 복사

희주(KHJ) 2022. 2. 9. 17:39

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]);

[결과]

그림으로 설명하면 다음과 같다

b값이 변경되면, 같은 주소의 값을 참조하는 a의 값도 변경됨

 

깊은 복사(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]);

결과

b[1]값만 변경

그림으로 표현하면 다음과 같다

a와 b는 서로 다른 주소값이기 때문에 한쪽이 값 변경해도 영향 X

※ 단, 객체를 담고 있는 배열일 경우 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 문을 이용하여 하나하나 복사해야한다

 

[참조]

https://woovictory.github.io/2020/04/22/Java-Array-Copy/

Comments