JAVA

Test099~100 배열의 복사

2020. 9. 6. 22:19

 ※ 배열 변수의 복사에는 데이터 복사, 주소값 복수 두 가지 형태가 존재한다.
   주소값 복사 → 얕은 복사 → 원본을 수정하면 복사본에 영향을 미치게 되는 복사 방법.
   (배열 뿐 아니라 모든 참조형 데이터에 해당하는 방법)
 

※ 데이터 복사 → 깊은 복사 → 실제 요소가 들어있는 값에 대한 복사로
   원본을 수정해도 복사본에 영향을 미치지 않는 복사 방법.

 

주소값 복사의 예)

// Test100.java 파일과 비교~!!!

// 주소값 복사

public class Test099
{
	public static void main(String[] args)
	{
		int[] nums = {10, 20, 30, 40, 50};	//-- 배열의 원본
		int[] copys;						//-- 복사본으로 만들 배열

		int temp;							//-- 실습 진행(테스트)을 위한 임시 변수
		
		//check~!!!
		copys = nums;						//-- 복사~!!!

		temp = nums[0];						//-- temp = 10

		nums[0] = 1000;						//-- nums = {1000, 20, 30, 40, 50}

		//copys 배열의 전체 요소 출력
		for (int i = 0; i < nums.length; i++)
			System.out.print(copys[i] + " ");
		System.out.println();
		//--==>> 1000 20 30 40 50

		System.out.println("temp : " + temp);
	
	}
}

 

데이터 복사의 예)

// 데이터 복사
//-- int형 배열에 대한 깊은 의미의 복사를 처리하는
//   메소드를 정의하는 형태로 실습을 진행한다.


public class Test100
{
	public static void main(String[] args)
	{
		int[] nums = {10, 20, 30, 40, 50};		//-- 배열 원본

		int[] copys1 = nums;					//-- 얕은 의미의 배열 복사 수행
												//   (주소값 복사)
		int[] copys2 = copyArray(nums);			//-- 깊은 의미의 배열 복사 수행
												//   (사용자 정의 메소드 호출)
		int[] copys3 = (int[])nums.clone();		//-- 깊은 의미의 배열 복사 수행
												//   (자바 제공 → clone() 메소드 호출)

		// 원본 배열 요소의 수정~!!!
		nums[1] = 2;

		for (int i = 0; i < copys1.length; i++)
			System.out.print(copys1[i] + " ");
		System.out.println();
		//--==>> copys1 : 10 2 30 40 50

		for (int i = 0; i < copys2.length; i++)
			System.out.print(copys2[i] + " ");
		System.out.println();
		//--==>> copys2 : 10 2 30 40 50

		for (int i = 0; i < copys3.length; i++)
			System.out.print(copys3[i] + " ");
		System.out.println();
		//--==>> copys3	 : 10 2 30 40 50

		
	}

	// 매개변수로 int 배열 타입을 넘겨받아
	// 이를 복사한 후
	// 복사한 배열을 결과값으로 반환하는 기능을 가진 메소드 정의
	public static int[] copyArray(int[] os)	// {10, 20, 30, 40, 50}
	{
		// 매개변수로 넘겨받은 배열(os)
		// 즉, 원본 배열 만큼의 배열방(메모리 공간, 길이)을 확보한
		// 복사할 배열방 생성
		int[] result = new int[os.length];	// int[] result = new int[5];
	
		// 각각의 원본 배열(os)에 담겨있는 각각의 요소들을 복사 배열(result)에 담아내기
		for (int i = 0; i < os.length; i++)
		{
			result[i] = os[i];
		}

		// 보가한 배열(result) 반환
		return result;



	}
}

 ※ Random 클래스 활용

 사용자로부터 임의의 정수를 입력받아 그 정수의 갯수만큼 난수(1~100)를 발생시켜서 배열에 담아내고
 배열에 담겨있는 데이터들 중 가장 큰 값과 가장 작은 값을 선택하여 결과를 출력하는 프로그램을 구현한다.

 실행 예)
 발생시킬 난수의 갯수 입력 : 6
 (53 17 69 45 10 55 → 무작위로 발생한 정수 형태의 난수들...)
 (int[] arr = {53, 17, 69, 45, 10, 55}; → 배열에 담아내기)
 가장 큰 값 : 69, 가장 작은 값 : 10
 계속하려면 아무키나 누르세요...


import java.util.Scanner;
import java.util.Random;

public class Test098
{
	public static void main(String[] args)
	{
		// Scanner 인스턴스 생성
		Scanner sc = new Scanner(System.in);

		// 안내 메세지 출력
		System.out.print("발생시킬 난수의 갯수 입력 : ");
		int size = sc.nextInt();

		// size 변수에 담아낸 수 만큼의 배열방 만들기
		// (배열 선언 및 메모리 할당)
		int[] arr = new int[size];

		// 무작위 숫자(난수)를 발생시키기 위해서는
		// 난수 발생 전용 객체 필요하다.
		// → "java.util.Random"
		Random rd = new Random();

		// ※ Random 클래스의 "nextInt(int n)" 메소드 
		//-- 0 ~ 매개변수로 넘겨받은 정수  n-1 까지의 수 중
		//	 무작위 정수(난수) 1개를 발생시킨다.

		// 테스트(확인)
		//System.out.println("발생한 난수 : " + rd.nextInt(10));
		// 0 ~ 9 까지의 무작위 정수 1개~!!!

		// 배열 구성(초기화) → 발생한 난수로 배열방에 값을 담아내기
		for (int i = 0; i < size; i++)
		{
			arr[i] = rd.nextInt(100);
			//-- 0 ~ 99 무작위 정수 한 개 발생
			arr[i] = rd.nextInt(100) + 1;
			//-- 1 ~ 100 무작위 정수 한 개 발생
		}
		
		// 테스트(확인) → 구성된 배열의 전체 요소 출력
		/*
		for (int i = 0; i < arr.length; i++)
			System.out.print(arr[i] + " ");
		System.out.println();
		//--==>> 발생시킬 난수의 갯수 입력 : 10
		//		 80 68 31 9 25 40 89 44 93 18
		//		 계속하려면 아무 키나 누르십시오 . . .
		*/

		// 가장 큰 값, 가장 작은 값 확인
		int max, min;		//-- 최대값, 최소값
		max = min = arr[0];	//-- max = min = 80;

		for (int i = 1; i < arr.length; i++)
		{
			if(max < arr[i])
				max = arr[i];	//-- max=93;
			if(min > arr[i])
				min = arr[i];	//-- min 9;
		}

		// 최종 결과 출력
		System.out.printf("가장 큰 값 : %d, 가장 작은 값 : %d\n", max,min);
	}
}

 

실행 결과

// 실행 결과
/*
발생시킬 난수의 갯수 입력 : 10
가장 큰 값 : 96, 가장 작은 값 : 7
계속하려면 아무 키나 누르십시오 . . .
*/

※ 배열의 배열(다차원 배열)을 활용하여 다음과 같은 데이터를 요소로 취하는 배열(5*5)을 구성하고
 그 결과를 출력하는 프로그램을 구현한다.
 단, 배열을 구성하는 구문과 출력하는 구문은 별도로 작성할수 있도록 한다.

 실행 예)

  A  
  C  B  
  D  E  F
  J  I  H  G   
  K  L  M  N  O
 계속하려면 아무 키나 누르세요...


public class Test097
{
	public static void main(String[] args)
	{
		char[][] arr = new char[5][5];

		char ch ='A';

		for (int i = 0; i < arr.length; i++)
		{
			for (int j = 0; j <= i ; j++)
			{	
				if(i % 2 == 0)
					arr[i][j] = ch++;
				else
					arr[i][i-j] = ch++;
			}	
		}
		
		// 전체 요소 출력
		for (int i = 0; i < arr.length; i++)
		{
			for (int j = 0; j < arr[i].length; j++)
			{
				System.out.printf("%2c",arr[i][j]);
			}
			System.out.println();
		}
	}
}

 

실행 결과

// 실행 결과
/*
 A
 C B
 D E F
 J I H G
 K L M N O
계속하려면 아무 키나 누르십시오 . . .
*/

※ 배열의 배열(다차원 배열)을 활용하여 다음과 같은 데이터를 요소로 취하는 배열(5*5)을 구성하고
 그 결과를 출력하는 프로그램을 구현한다.

 단, 배열을 구성하는 구문과 출력하는 구문은 별도로 작성할수 있도록 한다.

 실행 예)

  A  
  B  C  
  D  E  F
  G  H  I  J   
  K  L  M  N  O
 계속하려면 아무 키나 누르세요...


public class Test096
{
	public static void main(String[] args)
	{
		char[][] arr = new char[5][5];

		char ch ='A';

		for (int i = 0; i < arr.length; i++)
		{
			for (int j = 0; j <= i ; j++)
			{
				arr[i][j] = ch++;
			}
		}

		// 전체 요소 출력
		for (int i = 0; i < arr.length; i++)
		{
			for (int j = 0; j < arr[i].length; j++)
			{
				System.out.printf("%2c",arr[i][j]);
			}
			System.out.println();
		}
	}
}

 

실행 결과

// 실행 결과
/*
 A
 B C
 D E F
 G H I J
 K L M N O
계속하려면 아무 키나 누르십시오 . . .
*/

※ 배열의 배열(다차원 배열)을 활용하여 다음과 같은 데이터를 요소로 취하는 배열(4*5)을 구성하고
 그 결과를 출력하는 프로그램을 구현한다.
 단, 배열을 구성하는 구문과 출력하는 구문은 별도로 작성할수 있도록 한다.

 

 실행 예)

   1   2   3   4   10 
   5   6   7   8   26 
   9  10  11  12   42
  13  14  15  16   58
  28  32  36  40  136
 계속하려면 아무 키나 누르세요...


방법 ①


public class Test095
{
	public static void main(String[] args)
	{

		int[][] arr = new int[5][5];

		int n = 0;
		
		for (int i = 0; i < 4; i++)		// i → 0 1 2 3
		{
			for (int j = 0; j < 4; j++)	// j → 0 1 2 3
			{
				n++;					// n → 1 2 3 4 5 6 7 ...
				arr[i][j] = n;

				arr[i][4] += arr[i][j];	// 00 →1 01 →2 02 →3 03 →4
				arr[4][j] += arr[i][j];
				arr[4][4] += arr[i][j];
			}
		}

		// 전체 요소 출력
		for (int i = 0; i < arr.length; i++)
		{
			for (int j = 0; j < arr[i].length; j++)
			{
				System.out.printf("%4d",arr[i][j]);
			}
			System.out.println();
		}
		
	}
}

 

방법 ②

		// 5행 5열 배열 준비
		int[][] arr = new int[5][5];
		int n = 1;
		
		// 배열 요소 초기화
		for (int i = 0; i < arr.length; i++)
		{
			for (int j = 0; j < arr[i].length; j++)
			{
				if(i==4 || j==4)
					arr[i][j] = 0;
				else
					arr[i][j] = n++;
			}

		}

		for (int i = 0; i < arr.length-1; i++ )
		{
			for (int j = 0; j < arr[i].length-1; j++)
			{
					arr[i][4] += arr[i][j];
			}
			for (int k = 0; k < arr[i].length - 1; k++)
			{	
				arr[4][i]+=arr[k][i];
			}
							
		}

		for (int i=0; i < arr.length ;i++ )
		{
				arr[4][4]+=arr[i][4];
		}
        
       		// 전체 요소 출력
		for (int i = 0; i < arr.length; i++)
		{
			for (int j = 0; j < arr[i].length; j++)
			{
				System.out.printf("%4d",arr[i][j]);
			}
			System.out.println();
		}

 

실행 결과

 

// 실행 결과
/*
   1   2   3   4  10
   5   6   7   8  26
   9  10  11  12  42
  13  14  15  16  58
  28  32  36  40 136
계속하려면 아무 키나 누르십시오 . . .
*/

※ 배열의 배열(다차원 배열)을 활용하여 다음과 같은 데이터를 요소로 취하는 배열(5*5)을 구성하고
 그 결과를 출력하는 프로그램을 구현한다.
 단, 배열을 구성하는 구문과 출력하는 구문은 별도로 작성할수 있도록 한다.

 실행 예)

   E   J   O   T   Y 
   D   I   N   S   X 
   C   H   M   R   W 
   B   G  L   Q   V 
   A   F   K   P   U
  계속하려면 아무 키나 누르세요...


public class Test094
{
	public static void main(String[] args)
	{
		// 5행 5열 배열 준비
		int[][] arr = new int[5][5];
		char ch ='A';
		
		// 배열 요소 초기화
		for (int i = 0; i < arr.length; i++)
		{
			for (int j = arr.length - 1; j >= 0; j--)
			{
				arr[j][i] = ch++;
			}

		}

		// 전체 요소 출력
		for (int i = 0; i < arr.length; i++)
		{
			for (int j = 0; j < arr[i].length; j++)
			{
				System.out.printf("%3c",arr[i][j]);
			}
			System.out.println();
		}
	}
}

실행 결과

// 실행 결과
/*
  E  J  O  T  Y
  D  I  N  S  X
  C  H  M  R  W
  B  G  L  Q  V
  A  F  K  P  U
계속하려면 아무 키나 누르십시오 . . .
*/

+ Recent posts