Random 클래스

무작위 숫자(난수)를 발생시키는데 활용할 수 있는 유용한 클래스이다.

java.util 패키지에 있으므로 이 패키지를 import 하여 사용한다.

Random 인스턴스를 생성하고 nextInt(int n) 메소드를 호출하면 0 부터 (n-1) 까지의 정수 중 무작위 정수(난수) 1개를 발생시킨다.

 

예제 코드

/*=========================
  ■■■ 배열 ■■■
  - 배열과 난수 처리
=========================*/

// ※ 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];


		// Random 인스턴스 생성 (난수 발생용)
		Random rd = new Random();

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

		// 배열 구성(초기화) → 발생한 난수로 배열방에 값을 담아내기
		for (int i=0; i<size; i++)
		{
			//arr[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
		//		 44 56 53 19 45 43 45 78 50 7


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

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

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

// 실행 결과
/*
발생시킬 난수의 갯수 입력 : 10
61 59 42 55 49 93 11 85 95 34
가장 큰 값 : 95, 가장 작은 값 : 11
계속하려면 아무 키나 누르십시오 . . .
*/

배열의 복사

* 배열 변수의 복사에는 데이터 복사, 주소값 복사 두 가지 형태가 존재한다.
 - 주소값 복사 → 얕은 복사 → 원본을 수정하면 복사본에 영향을 미치게 되는 복사 방법.
   (배열 뿐 아니라 모든 참조형 데이터에 해당)
 - 데이터 복사 → 깊은 복사 → 실제 요소가 들어있는 값에 대한 복사로 원본을 수정해도 복사본에 영향을 미치지 않는 복사 방법. 원본과 복사본이 별개이다.

 

배열의 복사 예제 (주소값 복사, 얕은 복사)

/*=========================
  ■■■ 배열 ■■■
  - 배열의 복사
=========================*/

// Test100.java 파일과 비교~!!! (데이터 복사, 깊은복사)

// 주소값 복사, 얕은복사

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

		int temp;							//-- 실습 진행(테스트)을 위한 임시 변수

		// nums, copys는 참조타입, temp는 값 타입이라고 한다

		// check~!!!
		copys = nums;						//-- 복사~!!!

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

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

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

		System.out.println("temp : " + temp);
		//--==>> temp : 10
	}
}

 

배열의 복사 예제 (데이터 복사, 깊은 복사)

/*=========================
  ■■■ 배열 ■■■
  - 배열의 복사
=========================*/

// Test099.java 파일과 비교~!!! (주소값 복사, 얕은복사)

// 데이터 복사, 깊은복사
//-- 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;

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

		System.out.print("copys3 : ");
		for (int i=0; i<copys3.length; i++)
			System.out.print(copys3[i] + " ");
		System.out.println();
		//--==>> copys3 : 10 20 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++)		// for (int i=0; i<result.length; i++)
		{
			result[i] = os[i];
		}

		// 복사한 배열(result) 반환
		return result;
	}
}

 

당장의 배열 학습은 이것으로 마치고 컬렉션을 배우기 전까지 배열을 꾸준히 활용하도록 한다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기