본문 바로가기
Java

[Java] 배열의 복사? Shallow Copy(얕은 복사)와 Deep Copy(깊은 복사)

by 나는 개발자 2020. 12. 31.
TIL: 스스로 이해한 것을 바탕으로 정리하였기에 오류가 있을 수 있습니다. 틀린 부분은 댓글로 알려주시면 감사하겠습니다.

 

 

배열의 복사

배열은 크게 얕은 복사와 깊은 복사, 두 가지 방법으로 복사를 할 수 있다.

 

얕은 복사: 배열의 주소를 복사

깊은 복사: 배열 공간의 값들을 다른 배열 공간에 하나씩 복사

 

 

 

 

 

얕은 복사 

int [ ]  copy = origin ;

 

1. int[ ] origin = { 1, 2, 3, 4 } ;

원본 배열을 먼저 할당 후,

 

2. int[ ] copy = origin ; 

origin에 있는 것을 그대로 copy에 복사시킨다.

 

copy 각각의 인덱스를 출력해보면 origin의 값이 그대로 담긴다.

 

복사된 copy배열을 이용해서 n번 인덱스 값을 수정을 하면, 원본 배열의 인덱스까지 함께 변경된다. 

그 이유는 원본 배열과 복사본 배열은 둘 다 같은 곳을 참조하고 있기 때문이다. 

즉, 같은 주소값을 공유한다.

System.out.println(origin); 과 System.out.println(copy); 출력을 해보면 같은 주소값이 나온다.

 

 

이런 얕은 복사의 단점을 보완한 것이 깊은 복사이다.

 

 

 

 

 

 

깊은 복사

새로운 배열을 하나하나 생성해서 실제 내부값들을 복사한다.

 

깊은 복사는 for문, arraycopy메소드, copyOf메소드, clone메소드를 사용해서 4가지 방법으로 복사할 수 있다.

 

 

 

 

 

 

for문을 활용한 방법

 

아예 새로운 배열을 생성한 후 각 인덱스 별 내부 값을 하나하나 집어넣는 방법

int [ ] origin = { 10, 20, 30, 40 } ;
int [ ] copy = new int [4] ;

for (int i=0; i<origin.length(copy.length로도 가능) ; i++) {
        copy [ i ] = origin [ i ]
}

 

 

 

 

 

arraycopy( ) 메소드를 활용한 방법

새로운 배열을 생성한 후 System 클래스에서 arraycopy( )메소드를 불러온다.

int [ ] origin = { 10, 20, 30, 40 } ;
int [ ] copy = new int [4] ;

System.arraycopy (원본배열명, 복사를시작할인덱스, 복사본배열명, 복사본배열에시작할인덱스, 복사할갯수) ;
--> System.arraycopy (origin, 0, copy, 0, origin.length) ;

 

 

 

 

Arrays 클래스에서 제공하는 copyOf( ) 메소드를 활용한 방법

int [ ] origin = { 10, 20, 30, 40 } ;
int [ ] copy = Arrays.copyOf (원본배열명, 복사할갯수) ;
--> int [ ] copy = Arrays.copyOf (origin, 4) ;

 

System.arraycopy 메소드 : 몇번 인덱스부터 몇개를 어느 위치의 인덱스에 복사할 건지 전부 지정이 가능하다.

Arrays.copyOf 메소드 : 무조건 원본배열의 0번 인덱스부터 복사가 진행된다. 몇개의 복사를 진행할지는 지정가능하다. 

    

 

 

 

clone( ) 메소드 사용

인덱스와 복사할 갯수에 대한 직접 지정은 불가하며, 원본 배열을 통째로 복사한다.

int [ ] origin = { 10, 20, 30, 40 } ;
int [ ] copy = origin.clone( ) ;

 

 

댓글