순간을 기록으로

[Java] 배열을 복사하는 방법 본문

Development/JAVA

[Java] 배열을 복사하는 방법

luminous13 2022. 5. 8. 19:04

 

 

얕은 복사(Shallow Copy)

  • 객체의 주소값만을 복사하는 것
  • 주소 값이 같으므로 한쪽에서 값을 바꾸면 다른 쪽에서도 값이 바뀐다.
  • 장점
    • 하나의 객체만을 사용하기 때문에 메모리 낭비가 발생하지 않는다.
  • 단점
    • 여러 객체가 하나의 배열을 가리키기 때문에 값 변경할 때 실수가 발생할 수 있다.

 

public class Solution {
  public static void main(String[] args) {
    int[] a = {1, 2, 3, 4, 5};
    int[] b = a;

    System.out.println("a의 주소값: " + a);
    System.out.println("b의 주소값: " + b);
  }
}

 

주소 값이 같은 것을 알 수 있다.

 

깊은 복사(Deep Copy)

  • 객체의 실제값을 새로운 객체를 만들어서 복사하는 것.
  • 주소 값이 서로 다르므로 한쪽에서 값이 변경되어도 다른 쪽에서 변경되지 않는다.
  • 장점
    • 예기치 못한 실수가 얕은 복사에 비해 적다.
  • 단점
    • 여러 객체를 생성하기 때문에 메모리가 낭비될 수 있다.
public class Solution {
  public static void main(String[] args) {
    int[] a = {1, 2, 3, 4, 5};
    int[] b = new int[a.length];

    for (int i=0; i<b.length; i++) {
      b[i] = a[i];
    }

    System.out.println("a의 주소값: " + a);
    System.out.println("b의 주소값: " + b);
  }
}

주소 값이 다른 깊은 복사

배열을 복사하는 다양한 메소드

1. Object.clone() - 깊은 복사

  • Object.clone()은 원래 얕은 복사지만 기본형 배열의 경우 Cloneable과 Serialize 인터페이스가 구현되어있다. 따라서 깊은 복사가 가능하다.
  • 하지만 객체 배열인 경우에는 Cloneable 인터페이스를 구현해야 깊은 복사가 가능하다
  • 길이도 똑같은 배열을 만들고 싶을 때 사용한다.
public class Solution {
  public static void main(String[] args) {
    int[] a = {1, 2, 3, 4, 5};
    int[] b = a.clone(); // 1 2 3 4 5
  }
}

2.Arrays.copyOf() - 깊은 복사

  • 배열의 첫 원소부터 설정한 길이만큼의 배열을 생성합니다.
  • java.util.Arrays
import java.util.Arrays;

public class Solution {
  public static void main(String[] args) {
    int[] a = {1, 2, 3, 4, 5};
    int[] b = Arrays.copyOf(a, 7);	// 1 2 3 4 5 0 0
  }
}

 

3.Arrays.copyOfRange() - 깊은 복사

  • 배열의 복사를 특정 요소부터 특정 요소까지 지정하여 복사합니다.
  • java.util.Arrays
import java.util.Arrays;

public class Solution {
  public static void main(String[] args) {
    int[] a = {1, 2, 3, 4, 5};
    int[] b = Arrays.copyOfRange(a, 1,3);	// 2 3
  }
}

 

4.System.arraycopy()

  • Arrays.copyOf()와 기능은 같으나 성능이 더 좋습니다.
public class Solution {
  public static void main(String[] args) {
    int[] a = {1, 2, 3, 4, 5};
    int[] b = new int[a.length];
    System.arraycopy(a,0,b,0,5);
  }
}

 

Comments