복사

seni·2024년 6월 20일

JAVA

목록 보기
19/34

복사( .clone())

얕은복사

  • 배열은 참조형 복사이며 실제값이 아닌 실제값의 주소값을 가짐.
    • 배열 변수간에 대입 연산자 = 를 사용해서 복사를 하게 되면 주소값만 복사된다.
    • 이렇게 주소값만 복사되고 실제값은 1개로 유지되는걸 '얕은복사'라고 함
  • ex)int[] arr1 = {a,b,c} // -> {a,b,c}는 별도공간에 저장됨.
  • 만약 int[] arr2 = arr1
    • 할당 됐다고 가정하면, 할당된 값이 아니라 주소값이 복사됨.
    • arr2에 있는 값을 바꾸더라도 접근해서 바꾸기 때문에 arr1에도 영향이 감.
  int[] a = {1, 2, 3, 4}; 	//배열을 선언함
  int[] b = a;				//그냥 대입 연산자를 통해서 붙어넣음, 똑같은 값을 가진게 아니라 똑같은 주소값을 바라보고 있음.
  b[0] = 3; 				//b에 있는 0번째 값을 3으로 수정하면 a에 있는 0번째도 3으로 바뀜

깊은복사

  • 실제 값을 가지고 있는 배열의 기본형 값을 꺼내서 복사해주면 됨
  • 반복문 for을 통해서 하나씩 꺼내서 복사해주는 방법과 여러 메서드를 사용하는 방법이 있다
	int[] a = {1,2,3,4}
	int[] b = new int[a.length]; //a의 길이만큼!
    
    for(int i =0; i <a.length; i++) {
    	b[i] = a[i];
    }
  • 주소값이랑 상관없이 b라는 배열은 a가 가진 요소들로 이루어진 별도의 배열이 생성된다. a랑 b는 별도의 배열이 됨.

깊은 복사 메서드

    1. clone
    • 근본적인 방법X
    • 2차원이상 배열에서는 얕은 복사로 동작함.
int[] a = {1,2,3,4};
int[] b = a.clone();
    1. Arrays.copy0f
    • Arrays는 Array 관련된 기능을 모아놓은 유틸리티, copy0f라는 메서드
import java.util.Arrays;

public class Method1 {
    public static void main(String[] args) {
        int[] a = {1,2,3,4};
        int[] b = Arrays.copyOf(a,a.length);  //a를 복사, a의 길이만큼

        a[3] = 0;   //a배열에서 3번째 인덱스를 0으로 바꿈 4->0
        System.out.println(a[3]);  //4
        System.out.println(b[3]);  //0
    }
}
profile
개발일지

0개의 댓글