본문 바로가기
Dev/Java

04-2.ArrayCopy(깊은 복사)

by YoonYeoJin 2023. 7. 17.

ArrayCopy - 2

얕은 복사에 이어서 깊은 복사에 대해서 알아보자

깊은 복사와 얕은 복사의 가장 큰 차이점은 원본 배열에 영향을 미치는 지에 대한 여부이다.

 

얕은 복사는 복사본 배열의 값을 수정하면 원본 배열의 값도 바뀌지만

깊은 복사는 복사본 배열의 값을 수정하면 원본 배열의 값은 바뀌지 않는다.

 

얕은 복사를 메모리 영역으로 생각하면

얕은 복사
깊은 복사

깊은 복사를 하게 되면 그림과 같이 arr2처럼 주소값이 아예 새로운 배열이 생성된다.

 

깊은 복사를 하는 방법은 크게 4가지가 있다.

 

1. for문 사용

for문을 사용하는 방식은 원본 배열과 복사본 배열을 각각 선언 한 후 for문을 사용해서 원본 배열의 값을 복사본 배열에 각각 대입을 해주는 방식이라 이해하면 되겠다.

애초에 각각 배열을 선언하기 때문에 다른 주소값을 가지게 되므로 복사본 배열의 값을 수정해도 원본 배열에 영향을 미치지 않게 된다.

 

이를 코드로 확인해보자

일단 주소값이 다른 것을 확인할 수 있다.

복사본 배열의 값을 하나 수정하고 출력을 해보자

복사본 배열의 2번 인덱스의 값을 99로 수정해도 복사본의 값만 바뀐 것을 확인할 수 있다.

 

2. arraycopy() 메소드

for문을 사용하지 않더라도 간단한 메소드를 사용해서 배열을 복사할 수 있다.

System 클래스에 있는 arraycopy() 메소드를 이용하는 것인데

표현법은 다음과 같다.

 

System.arraycopy(원본 배열명, 복사를 시작할 (원본)인덱스, 복사본 배열명, 복사본 배열의 복사될 시작인덱스, 복사할 개수)

코드에 사용된 메소드를 해석해보면

"origin 배열의 0번인덱스부터 3개의 길이를 copy 배열에 복사한다"

로 해석할 수가 있다.

 

3. Arrays 클래스에서 제공하는 copyOf() 메소드 사용

arraycopy()메소드 외에도 다른 메소드가 있다.

Arrays 클래스에서 copyOf() 메소드를 사용하는 것이다.

바로 코드로 알아보면

copyOf() 메소드의 표현법은 다음과 같다

Arrays.copyOf(원본배열명, 복사할 길이)

그래서 기존 배열이 1,2,3,4,5지만 메소드 사용 시 복사할 길이를 제시하면 그 해당 길이만큼만 복사하게 된다.

 

4. clone()

clone()메소드 역시 배열을 복사할 때 사용하는 메소드이지만 위에서 살펴본 두개의 메소드와의 차이가 있다면

arraycopy(), copyOf() 메소드는 원하는 길이를 지정하고 특히 arraycopy() 메소드는 시작하는 위치까지 지정할 수 있지만,

clone은 인덱스나 크기를 별도로 지정할 수 없다.

 

표현법은 다음과 같다

clone 메소드를 사용하면 메소드 내에 별도의 매개변수의 사용없이 그대로 배열이 복사된 것을 확인할 수 있다.

 

 

 

배열의 복사 중 깊은 복사를 하는 4가지 방법을 알아보았는데

만약 메소드가 기억나지 않는다면 for문을 돌려서 직접 배열을 복사하는 방법도 있겠지만,

저런 메소드를 알아두는 것도 나중에 유용하게 사용할 수 있을것 같다.

 

'Dev > Java' 카테고리의 다른 글

05-2. 다양한 함수(String 관련)  (0) 2023.07.25
05-1. 다양한 함수(Math.random)  (1) 2023.07.25
04-1.ArrayCopy (얕은 복사)  (0) 2023.07.17
03. continue  (0) 2023.07.12
02.while / do-while  (0) 2023.07.12