본문 바로가기
JAVA

[JAVA] - 깊은 복사 (Deep Copy) & 얕은 복사(Shallow Copy)

by nam_ji 2024. 1. 8.

깊은 복사 & 얕은 복사 개념 정리

얕은 복사 (Shallow Copy)

  • 얕은 복사
    • 배열은 참조형 변수이+며 실제값이 아닌 실제값의 주소값을 가집니다.
    • 따라서 배열 변수간에 대입 연산자 = 를 사용해서 복사를 하게 되면 주소값만 복사됩니다.
    • 이렇게 주소값만 복사되고 실제값은 1개로 유지되는걸 얕은 복사라고 합니다
  • 주소값만 복사된다?
    • 주소값만 복사된다는건 변수명은 서로 다르지만 같은 값을 보고 있다는 것을 뜻합니다.
    • 비유하자면 내가 가진 핸드폰, PC 로 각각 카카오톡에 로그인해도 나의 카톡 계정은 1개인 것처럼, 변수명은 여러 개지만 결국 실제값은 1개인 것과 같다고 보시면 됩니다.
  • // 얕은 복사
    
    int[] a = { 1, 2, 3, 4 };
    int[] b = a; // 얕은 복사
    
    b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)
    
    System.out.println(a[0]); // 출력 3  <- a 배열의 0번째 순번값도 3으로 조회됩니다.

깊은 복사 (Deep Copy)

  • 깊은 복사
    • 얕은 복사처럼 가짜 복사가 아니라 진짜 새로운 배열을 똑같이 만들고 싶을때 깊은 복사를 합니다.
    • 깊은 복사는 결국 실제 값을 가지고 있는 배열의 기본형 값을 꺼내서 복사해주면 됩니다.
    • for문을 통해서 하나씩 꺼내서 복사해주는 방법과 여러 메서드를 사용하는 방법이 있습니다.
  • // 깊은 복사
    
    int[] a = { 1, 2, 3, 4 };
    int[] b = new int[a.length]; 
    
    for (int i = 0; i < a.length; i++) {
        b[i] = a[i]; // 깊은 복사
    }
    
    b[0] = 3; // b 배열의 0번째 순번값을 3으로 수정했습니다. (1 -> 3)
    
    System.out.println(a[0]); // 출력 1 <- 깊은 복사를 했기때문에 a 배열은 그대로 입니다.
  • // 깊은 복사 메서드
    
    // 1. clone() 메서드
    int[] a = { 1, 2, 3, 4 };
    int[] b = a.clone(); // 가장 간단한 방법입니다. 
    // 하지만, clone() 메서드는 2차원이상 배열에서는 얕은 복사로 동작합니다!!
  • // 깊은 복사 메서드
    
    import java.util.Arrays;
    
    public class Main {
    	public static void main(String[] args) {
    		// 2. Arrays.copyOf() 메서드
    		int[] a = { 1, 2, 3, 4 };
    		int[] b = Arrays.copyOf(a, a.length); // 배열과 함께 length값도 같이 넣어줍니다.
    	}
    }

'JAVA' 카테고리의 다른 글

[JAVA] - String 배열  (0) 2024.01.09
[JAVA] - 다차원 배열  (0) 2024.01.08
[JAVA] - 배열  (0) 2024.01.08
[JAVA] - break, continue  (0) 2024.01.08
[JAVA] - 반복문 (for, while)  (0) 2024.01.08