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);
}
}