반응형
배열 복사
: 옅은 복사와 깊은 복사가 존재한다.
옅은 복사
: 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값이 같이 변경되는 것을 말한다.
배열은 주소만 복사되기 때문에 그러하다.
package kr.or.ddit.study05.sec02;
import java.util.Arrays;
import java.util.Scanner;
public class ArrayExample03 {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
ArrayExample03 obj = new ArrayExample03();
obj.method1();
}
public void method1() {
/*
* 배열 복사 : 옅은 복사, 깊은 복사
*
* 옅은 복사 : 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값이 같이 변경 (배열 주소만 복사.)
*/
int[] source = {1, 2, 3, 4, 5};
int[] target = source;
// Arrays.toString()은 배열을 전체적으로 출력해준다.
// source만 입력한다면 주소값만 출력된다.
System.out.println("옅은 복사 (변경 전 원본 배열(source)) : " + Arrays.toString(source));
target[0] = 500;
System.out.println("-------------------------------------------------------------");
// 같은 주소값을 가지고 있기 때문에 같이 변경된다.
System.out.println("옅은 복사 (변경 후 원본 배열(source)) : " + Arrays.toString(source));
System.out.println("옅은 복사 (변경 후 원본 배열(target)) : " + Arrays.toString(target));
int a = 10;
int b = a;
b = 17;
// ? a 값과 b 값 ?
}
}
깊은 복사
: 배열 공간을 별도로 확보 후 복사하는 배열을 말한다.
1. 반복문 사용.
package kr.or.ddit.study05.sec02;
import java.util.Arrays;
import java.util.Scanner;
public class ArrayExample03 {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
ArrayExample03 obj = new ArrayExample03();
obj.method2();
}
public void method2() {
/*
* 깊은 복사.
* 배열 공간을 별도로 확보.
*
* 1. 반복문 사용.
* 2. System.arracCopy() 사용
* 3. clone() 사용
*/
/*
* 1. 반복문 이용
*/
int[] source = {1, 2, 3, 4, 5};
int[] target = new int[source.length];
for(int i=0; i<source.length; i++) {
target[i] = source[i];
}
target[0] = 500;
System.out.println("1. 반복문 사용");
System.out.println("깊은 복사 (원본 배열(source))" + Arrays.toString(source));
System.out.println("깊은 복사 (복사 배열(target))" + Arrays.toString(source));
}
}
2. System.arrayCopy() 사용
: 특정 시스템을 잘라 사용하고 싶을 때 적합하다.
System.arraycopy(원본 배열, 복사 시작위치, 타겟 배열, 복사 받을 위치, 길이);
package kr.or.ddit.study05.sec02;
import java.util.Arrays;
import java.util.Scanner;
public class ArrayExample03 {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
ArrayExample03 obj = new ArrayExample03();
obj.method2();
}
public void method2() {
/*
* 깊은 복사.
* 배열 공간을 별도로 확보.
*
* 1. 반복문 사용.
* 2. System.arrayCopy() 사용
* 3. clone() 사용
*/
// 2. System.arracCopy() 사용
int[] source = {1, 2, 3, 4, 5};
int[] target2 = new int[5];
// System.arraycopy(원본 배열, 복사 시작위치, 타겟 배열, 복사 받을 위치, 길이);
System.arraycopy(source, 0, target2, 1, 3);
target2[0] = 1000;
System.out.println("2. System.arracCopy() 사용");
System.out.println("깊은 복사 (원본 배열(source))" + Arrays.toString(source));
System.out.println("깊은 복사 (복사 배열(target2))" + Arrays.toString(target2));
}
}
3. Object 클래스 clone() 사용
: 배열의 값만 복사하고자 할때 적합하다.
package kr.or.ddit.study05.sec02;
import java.util.Arrays;
import java.util.Scanner;
public class ArrayExample03 {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
ArrayExample03 obj = new ArrayExample03();
obj.method2();
}
public void method2() {
/*
* 깊은 복사.
* 배열 공간을 별도로 확보.
*
* 1. 반복문 사용.
* 2. System.arracCopy() 사용
* 3. clone() 사용
*/
// 3. Object 클래스 clone() 사용
int[] source = {1, 2, 3, 4, 5};
int[] target3 = source.clone();
target3[0] = 2000;
System.out.println("3. Object 클래스 clone() 사용");
System.out.println("깊은 복사 (원본 배열(source))" + Arrays.toString(source));
System.out.println("깊은 복사 (복사 배열(target3))" + Arrays.toString(target3));
}
}
package kr.or.ddit.study05.sec02;
import java.util.Arrays;
import java.util.Scanner;
public class ArrayExample03 {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
ArrayExample03 obj = new ArrayExample03();
obj.method3();
}
public void method3() {
String[] name = {"이미숙", "김민진", "이종진", "오선영"};
// 원본 배열 출력
System.out.println("원본 배열(name) " + Arrays.toString(name));
String temp = name[name.length-1];
name[name.length-1] = name[0];
name[0] = temp;
// 배열 맨 끝이 바뀐 배열 출력
System.out.println("바뀐 배열(name) " + Arrays.toString(name));
}
}
정렬 메소드
Arrays.sort(배열명);
package kr.or.ddit.study05.sec02;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class ArrayExample03 {
Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
ArrayExample03 obj = new ArrayExample03();
obj.method4();
}
public void method4() {
/*
* lotto 번호 6개 만들기
*/
int[] nums = new int[45];
// 1. nums 에 값을 0번 배열 -> 1 넣기
// 1번 배열 -> 2 넣기
// 44번 배열 -> 45 값을 넣어보기
for(int i=0; i<nums.length; i++) {
nums[i] = i+1;
}
System.out.println("nums 섞기 전의 값");
System.out.println(Arrays.toString(nums));
System.out.println("====================================================================");
// 2. nums 값을 섞기
for(int i=0; i< 10000; i++) {
int ran = new Random().nextInt(nums.length);
// nextInt의 경우 지정된 범위 중에서만 가져옴.
int temp = nums[0];
nums[0] = nums[ran];
nums[ran] = temp;
}
System.out.println("nums 섞은 후의 값");
System.out.println(Arrays.toString(nums));
System.out.println("====================================================================");
// 3. lotto 배열에 앞자리 6개만 복사해서 넣기.
int[] lotto = new int[6];
// for(int i=0; i<lotto.length; i++) {
// lotto[i] = nums[i];
// }
System.arraycopy(nums, 0, lotto, 0, 6);
System.out.println("lotto의 값");
System.out.println(Arrays.toString(lotto));
System.out.println();
// 4. 정렬하기
// for(int i=0; i<lotto.length-1; i++) {
// boolean end = true;
// for(int j=0; j<lotto.length-1; j++) {
// if(lotto[j] > lotto[j+1]) {
// int temp = lotto[j];
// lotto[j] = lotto[j+1];
// lotto[j+1] = temp;
//
// end = false;
// }
// }
// if(end) break;
// }
// 4.2 정렬 메소드 이용하기.
Arrays.sort(lotto);
System.out.println(Arrays.toString(lotto));
}
}
반응형
'자바' 카테고리의 다른 글
[Java 초급] 13장 클래스 (0) | 2023.12.15 |
---|---|
[Java 초급] 11.5장 테스트 (0) | 2023.12.13 |
[Java 초급] 10.5.2장 테스트 (0) | 2023.12.12 |
[Java 초급] 11장 2차원 배열 (0) | 2023.12.12 |
[Java 초급] 10.5.1장 테스트 (0) | 2023.12.11 |