반응형

 

배열 복사

 

: 옅은 복사깊은 복사가 존재한다.

 

 

 

옅은 복사

 

: 복사된 배열이나 원본 배열이 변경될 때 서로 간의 값이 같이 변경되는 것을 말한다.

배열은 주소만 복사되기 때문에 그러하다.

 

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

 

 

 

깊은 복사

 

: 배열 공간별도확보 후 복사하는 배열을 말한다.

 

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

 

 

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

 

 

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

 

결과 화면4

 

 

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

 

결과 화면5

 

 

 

정렬 메소드

 

 

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

 

결과 화면6

 

 

반응형

'자바' 카테고리의 다른 글

[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