[Java] 배열 복사(얕은 복사,깊은 복사), Object 클래스
배열
배열 복사
배열은 한 번 생성하면 크기 변경 불가
-> 더 큰 배열을 새로 만들고 이전 배열로부터 항목 값 복사해야 함.
배열 복사 방법
얕은 복사(shallow copy)
주소 복사 -> 동일 주소 공유
원본에 변화 발생하면 사본에 변화 반영
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public static void main(String[] args) {
int [] oriArr = {11,12,13,14,15}; //원본배열
System.out.println(oriArr); //[I@15db9742
System.out.println(Arrays.toString(oriArr)); //[11, 12, 13, 14, 15]
int[] copyArr = new int[oriArr.length*2]; //원본 배열의 2배 길이인 새 배열 선언
System.out.println(copyArr); //[I@6d06d69c
System.out.println(Arrays.toString(copyArr)); //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
System.out.println();
copyArr=oriArr; //새배열명=원본배열명(배열 주소가 복사됨)
System.out.println(copyArr); //[I@15db9742
System.out.println(Arrays.toString(copyArr)); //[11, 12, 13, 14, 15]
oriArr[0]=77; System.out.println(Arrays.toString(oriArr)); //[77, 12, 13, 14, 15]
System.out.println(Arrays.toString(copyArr)); //[77, 12, 13, 14, 15]
}
|
cs |
깊은 복사(deep copy)
-> 원본 배열에 변경이 있어도 사본배열에 영향이 없다.
1) for문 이용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public static void main(String[] args) {
int [] oriArr = {11,12,13,14,15}; //원본배열
System.out.println(oriArr); //[I@15db9742
System.out.println(Arrays.toString(oriArr)); //[11, 12, 13, 14, 15]
int[] copyArr = new int[oriArr.length*2]; //원본 배열의 2배 길이인 새 배열 선언
System.out.println(copyArr); //[I@6d06d69c
System.out.println(Arrays.toString(copyArr)); //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
System.out.println();
for(int i=0; i<oriArr.length; i++) {
copyArr[i]=oriArr[i];
}
System.out.println(Arrays.toString(copyArr));
oriArr[0]=0;
System.out.println(oriArr);
System.out.println(copyArr);
System.out.println(Arrays.toString(oriArr));
System.out.println(Arrays.toString(copyArr));
}
|
cs |
* 실행 결과
[I@15db9742
[11, 12, 13, 14, 15]
[I@6d06d69c
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[11, 12, 13, 14, 15, 0, 0, 0, 0, 0]
[I@15db9742
[I@6d06d69c
[0, 12, 13, 14, 15]
[11, 12, 13, 14, 15, 0, 0, 0, 0, 0]
2) Object.clone(); 이용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public static void main(String[] args) {
int [] oriArr = {11,12,13,14,15}; //원본배열
System.out.println(oriArr); //[I@15db9742
System.out.println(Arrays.toString(oriArr)); //[11, 12, 13, 14, 15]
int[] copyArr = new int[oriArr.length*2]; //원본 배열의 2배 길이인 새 배열 선언
System.out.println(copyArr); //[I@6d06d69c
System.out.println(Arrays.toString(copyArr)); //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
System.out.println();
copyArr = oriArr.clone();
System.out.println(Arrays.toString(copyArr));
oriArr[0]=0; // 원본에 변경이 있어도 사본배열에 영향 없음
System.out.println(oriArr);
System.out.println(copyArr);
System.out.println(Arrays.toString(oriArr));
System.out.println(Arrays.toString(copyArr));
}
|
cs |
* 실행 결과
[I@15db9742
[11, 12, 13, 14, 15]
[I@6d06d69c
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[11, 12, 13, 14, 15]
[I@15db9742
[I@7852e922
[0, 12, 13, 14, 15]
[11, 12, 13, 14, 15]
※주의 : 1차원 배열은 깊은 복사이지만, 2차원 배열 시 얕은 복사.
3) Arrays.copyOf(원본배열, 길이); 이용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public static void main(String[] args) {
int [] oriArr = {11,12,13,14,15}; //원본배열
System.out.println(oriArr); //[I@15db9742
System.out.println(Arrays.toString(oriArr)); //[11, 12, 13, 14, 15]
int[] copyArr = new int[oriArr.length*2]; //원본 배열의 2배 길이인 새 배열 선언
System.out.println(copyArr); //[I@6d06d69c
System.out.println(Arrays.toString(copyArr)); //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
System.out.println();
copyArr = Arrays.copyOf(oriArr,oriArr.length);
System.out.println(Arrays.toString(copyArr));
oriArr[0]=0;
System.out.println(oriArr);
System.out.println(copyArr);
System.out.println(Arrays.toString(oriArr));
System.out.println(Arrays.toString(copyArr));
}
|
cs |
* 실행 결과
[I@15db9742
[11, 12, 13, 14, 15]
[I@6d06d69c
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[11, 12, 13, 14, 15]
[I@15db9742
[I@7852e922
[0, 12, 13, 14, 15]
[11, 12, 13, 14, 15]
4) Arrays.copyOfRange(원본배열, 시작인덱스, 끝인덱스-1); 이용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public static void main(String[] args) {
int [] oriArr = {11,12,13,14,15}; //원본배열
System.out.println(oriArr); //[I@15db9742
System.out.println(Arrays.toString(oriArr)); //[11, 12, 13, 14, 15]
int[] copyArr = new int[oriArr.length*2]; //원본 배열의 2배 길이인 새 배열 선언
System.out.println(copyArr); //[I@6d06d69c
System.out.println(Arrays.toString(copyArr)); //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
System.out.println();
copyArr = Arrays.copyOfRange(oriArr , 0 , oriArr.length);
System.out.println(Arrays.toString(copyArr));
oriArr[0]=0;
System.out.println(oriArr);
System.out.println(copyArr);
System.out.println(Arrays.toString(oriArr));
System.out.println(Arrays.toString(copyArr));
}
|
cs |
* 실행 결과
[I@15db9742
[11, 12, 13, 14, 15]
[I@6d06d69c
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[11, 12, 13, 14, 15]
[I@15db9742
[I@7852e922
[0, 12, 13, 14, 15]
[11, 12, 13, 14, 15]
=> 원본배열의 인덱스 0부터 인덱스 3전까지 복사
위와 같을 때 System.out.println(Arrays.toString(copyArr)); 실행 결과 : [11, 12, 13]
=> 인덱스1부터 3전까지 복사
위와 같을 때 System.out.println(Arrays.toString(copyArr)); 실행 결과 : [12, 13]
=> 인덱스1부터 10전까지 복사
=> 3번쨰 매개변수가 배열의 길이보다 클 경우 -> 남은 부분은 0으로 채운다.
위와 같을 때 System.out.println(Arrays.toString(copyArr)); 실행 결과 : [12, 13, 14, 15, 0, 0, 0, 0, 0]
5) System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length); 이용
=>System.arraycopy(원본배열 , 원본배열시작인덱스, 새배열, 새배열시작인덱스, 복사할 개수);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public static void main(String[] args) {
int [] oriArr = {11,12,13,14,15}; //원본배열
System.out.println(oriArr); //[I@15db9742
System.out.println(Arrays.toString(oriArr)); //[11, 12, 13, 14, 15]
int[] copyArr = new int[oriArr.length*2]; //원본 배열의 2배 길이인 새 배열 선언
System.out.println(copyArr); //[I@6d06d69c
System.out.println(Arrays.toString(copyArr)); //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
System.out.println();
System.arraycopy(oriArr, 0, copyArr, 0, 5);
System.out.println(Arrays.toString(copyArr)); //[11, 12, 13, 14, 15, 0, 0, 0, 0, 0]
oriArr[0]=0;
System.out.println(oriArr);
System.out.println(copyArr);
System.out.println(Arrays.toString(oriArr));
System.out.println(Arrays.toString(copyArr));
}
|
cs |
* 실행 결과
[I@15db9742
[11, 12, 13, 14, 15]
[I@6d06d69c
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[11, 12, 13, 14, 15, 0, 0, 0, 0, 0]
[I@15db9742
[I@6d06d69c
[0, 12, 13, 14, 15]
[11, 12, 13, 14, 15, 0, 0, 0, 0, 0]
위와 같을 때 System.out.println(Arrays.toString(copyArr)); 실행 결과 : [13, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Object 클래스
클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않더라도
암시적으로 java.lang.Object 클래스를 상속하게 됨.
따라서 자바의 모든 클래스는 Object 클래스의 자식이거나 자손 클래스
즉, Object는 자바의 최상의 부모클래스에 해당
객체 문자 정보(toString())
객체의 문자 정보를 리턴.
객체의 문자 정보란 객체를 문자열로 표현한 값을 말함.
기본적으로 Object 클래스의 toString() 메소드는 '클래스이름@16진수해시코드'로 구성된 문자 정보를 리턴함.
Arrays클래스
java.utill.Arrays
배열을 다루는데 유용한 여러 메서드를 제공.
Arrays클래스의 모든 메서드는 static메서드이다.
-> (객체생성하지 않고) 클래스명.메서드명()
-> 예) Arrays.toSring()
Arrays.toString(배열)
배열의 값들(element,요소)을 []문자 안에 넣어서 String타입으로 리턴
1
2
3
4
|
public static void main(String[] args) {
int [] arr1 = {11,12,13,14,15};
System.out.println(Arrays.toString(arr1));
}
|
cs |
* 실행 결과
[11, 12, 13, 14, 15]