티스토리 뷰
자바에서 객체를 복사하는 유형으로 깊은 복사와 얕은 복사가 있습니다. 깊은 복사의 경우 객체의 실제값을 새로운 객체로 복사하는 것이고 얕은 복사는 단순히 객체의 주소 값만을 복사하는 것입니다. 이 두가지 방식은 각각의 장단점이 있습니다. 먼저 얕은 복사의 경우 여러 객체가 같은 주소를 참조하기 때문에 하나의 값을 변경해버리면 다른 대상의 값 또한 바뀌어 버리는 문제 등이 발생합니다. 하지만 깊은 복사의 경우 실제로 대상이 두개가 생기므로 이러한 문제에서는 자유로울 수 있습니다. 반대로 메모리 측면에서 본다면 한 객체로 할 수 있는 일은 하나로 끝내는 것이 좋습니다. 쓸데없이 두개 세개가 되면 그야말로 메모리 측면에서 본다면 비효율적이게 됩니다.
이렇듯 얕은 복사로 객체가 복사된다면 실제로는 하나의 주소 값을 가지고 있으므로 하나라고 볼 수 있습니다. 하나의 객체로써 사용이 가능하다면 쓸데없이 객체를 복사하여 사용할 필요는 없지만 이럴 경우 복사한다는 의미보다는 같이 사용한다라는 의미가 됩니다. 그렇기에 대개 객체를 복사한다는 말은 얕은 복사가 아닌 깊은 복사를 의미합니다.
얕은 복사(Shallow Copy) : 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값이 같이 변경됩니다.
깊은 복사(Deep Copy) : 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값은 바뀌지 않습니다.
public class Array_Copy{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = a;
}
}
= 연산자는 주소를 이어준다는 의미입니다. 해당 코드로 a의 배열을 b배열로 = 연산자를 활용하여 대입하면 깊은 복사가 되지 않고 얕은 복사가 됩니다. 그렇기에 b배열의 값을 수정하여도 a배열까지 같이 수정되어버리는 상황이 옵니다. 이렇게 되면 사실상 배열을 복사하는 의미가 없습니다.
public class Array_Copy{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = a[i];
}
}
}
상황에 따라 다를수는 있겠지만 제대로 배열을 복사하는 의미를 가지려면 배열의 깊은 복사를 하여야 합니다. 그래야 복사한 배열을 수정하더라도 원본에 배열이 변경되지 않습니다. 위와 같이 for문을 돌려가며 일일이 값을 옮겨도 되지만 자바에서 배열을 복사할 수 있는 여러 가지 메서드를 제공하고 있으니 그것들을 활용하면 배열을 쉽게 복사할 수 있습니다.
배열을 복사하는 여러가지 메서드
Object.clone()
protected Object clone() throws CloneNotSupportedException
public class Array_Copy{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone();
}
}
clone 메서드는 네이티브 메서드로, 해당하는 객체의 모든 필드를 복사하여 새로운 객체에 넣어 반환하여 준다.
Array.clone()을 사용하면 배열을 쉽게 복사할 수 있습니다. (깊은 복사) 가장 보편적인 방법입니다.
Arrays.copyOf()
public static int[] copyOf(int[] original, int newLength)
original : 복사할 배열
newLength : 배열의 길이, 원본 배열의 길이를 넘어가는 경우에는 null이 들어간다.
import java.util.Arrays;
public class Array_Copy{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(a, a.length);
}
}
Arrays 클래스는 배열을 조작할 수 있는 메소드를 가진 클래스입니다. 이 클래스 안에 있는 Arrays.copyOf()를 사용하면 배열의 시작점 ~ 원하는 length까지 배열의 깊은 복사를 할 수 있습니다.
Arrays.copyOfRange()
public static <T> T[] copyOfRange(T[] original, int from, int to)
original : 복사할 배열
from : 복사할 배열의 시작 인덱스(포함)
to : 복사할 배열의 마지막 인덱스(포함X)
import java.util.Arrays;
public class Array_Copy{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOfRange(a, 1, 3);
}
}
Arrays.copyOf()는 배열의 처음~지정한 length까지 복사하는 메서드였다면 Arrays.copyOfRange() 메서드는 복사할 배열의 시작점도 지정할 수 있습니다.
'Java > Java 기초' 카테고리의 다른 글
[Java] String클래스 메서드 replace()와 replaceAll() 차이점 (0) | 2024.04.11 |
---|---|
[Java] 문자열 공백제거 (trim, replace) (0) | 2024.04.09 |
[Java] char 배열을 String 문자열로 변환하기 (0) | 2024.03.20 |
[Java] startsWith/endsWith (특정 문자로 시작하거나 끝나는지 체크) (0) | 2024.03.18 |
[Java] String, StringBuilder, StringBuffer의 차이 (0) | 2024.02.16 |
- Total
- Today
- Yesterday
- 배열 만들기3
- 브라우저의 기본 구조
- Object.clone()
- StringBuilder
- 배열만들기1
- 스코프
- 콜백 큐
- 대소문자 변환
- replace와 replaceAll의 차이점
- rep;ㅁce
- 렌더링 과정
- nodelist
- useeffet
- 프로그래머스
- n 번째 원소부터
- 신입개발자 면접 준비
- startsWith()
- SQL 개발자
- replaceAll
- 엑셀 파일 추출
- Replace
- Java
- 문자열 반복하기
- SQLD
- 블록스코프
- 중첩스코프
- 호이스팅
- 프로그래머스 세로 읽기
- 마진과 패딩의 차이점
- 프로그래머스 qr code
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |