국비/Java

[07-1] Java - 배열, 배열복사

박머루 2022. 4. 15. 20:32

~ 배열 실습~

public void minMax() {//실습1 
		
		// 10개의 값을 저장할 수 있는 정수형 배열을 선언 및 할당하고
		// 1 ~ 10 사이의 난수(랜덤값)를 발생시켜 배열에 초기화한 후
		// 배열 전체 값과 그 값 중에서 최대값과 최소값을 출력하세요
		
		int[] iArr = new int[10]; // 1. 10개 값을 저장할 수 있는 정수형 배열
		
		for(int i = 0; i < iArr.length; i++) {
			iArr[i] = (int)(Math.random()*10) + 1;
			System.out.println(iArr[i]);
			}
		
		int min = iArr[0];
		int max = iArr[0];
		for(int i = 0; i < iArr.length; i++) {
			if(min > iArr[i]) {
				min = iArr[i];
			}else if(max < iArr[i]) {
				max = iArr[i];
			}
		}
		System.out.println("\n최소값 : " + min);	
		System.out.println("최대값 : " + max);	
			
	}//실습1끝
public void lotto() { // 실습2 로또 시작
		
		// 중복값 없이 로또 번호를 출력하세요
		// ex.
		// 10 31 2 5 8 28
		
		int[] lotto = new int[6];
		
		for(int i = 0; i < lotto.length; i++) { //for 시작
			
			lotto[i] = (int)(Math.random() * 45 + 1);
			
			if(i > 0) { //if 시작
				for(int j = 0; j < i; j++) {
					if(lotto[j] == lotto[i]){
						System.out.println(lotto[i] + "중복값발생!");
						i--;
						break;
					}
				}
			} // if 끝
			System.out.print(lotto[i] + " ");
		
		}// for 끝
		Arrays.sort(lotto); // 오름차순 정렬
		System.out.println(Arrays.toString(lotto));
			
	}// 로또 끝
중복값 구하는 법 익히기!!!!
랜덤값 >> lotto[i] = (int)(Math.random() * 45 + 1);
오름차순 정렬 >> Arrays.sort(lotto);
// 배열 선언 및 할당과 동시에 초기화(대입)까지 한 번에 끝내는 방법
// 권장하는 방법은 아님

* arr[0] = 1;
* arr[1] = 3;
* arr[2] = 8;
* arr[3] = 5;


초기화 안하면 int형 배열은 0, double형 배열은 0.0

// 방법1.
int[] arr1 = new int[] {1, 3, 8, 5};


// 방법2.
int[] arr2 = {1, 3, 8, 5};

String[] students = {"백노바", "강초당", "장폰주", "망난이", "송몽숙", "구라베"}; //하드코딩
❗배열 복사
* 1. 얕은 복사 : 배열의 주소값만을 복사한다

int[] origin = {1, 2, 3, 4, 5};
int[] copy = origin;
System.out.println(origin.hashCode() + " \n" + copy.hashCode());
// 해시코드를 비교하면 원본과 복사본이 같은 해시코드를 가진 것을 확인할 수 있다
// 해시코드가 동일하다고 두 배열이 완전히 같다고 100% 장담할 수 없지만, 해시코드가 다르면 두 개는 완전히 다른 배열임
// 얕은복사 => 배열의 주소값이 복사되어 원본과 복사본이 같다!

* 2. 깊은 복사 : 동일한 새로운 배열을 하나 생성해서 실제 내부값까지 복사한다, 주소값 다름

** 방법1)
int[ ] origin = {1, 2, 3, 4, 5};
int[ ] copy = new int[origin.length]; // 1단계 : 기존과 동일한 크기의 새 배열을 생성 및 할당
for(int i = 0; i < copy.length; i++) { // 2단계 : 반복문을 사용하여 값 대입
copy[i] = origin[i];
// 실제 우리가 원하는 배열 내부의 값들이 복사된 것을 확인할 수 있다
// 주소값 복사XXX

** 방법2)
arrayclopy( ) 메소드 이용
1단계 : 새로운 배열을 생성한 후
2단계 : System 클래스에서의 arraycopy() 호출
몇 번 인덱스부터 몇 개를 어느 위치부터 넣을 것인지 직접 지정 가능하다!! >> 괄호 안에 작성
* System.arraycopy(src, srcPos, dest, destPos, length);
* System.arraycopy(원본배열이름, 원본배열에서 복사를 시작할 인덱스 번호, 복사본 배열 이름, 복사본 배열에서 복사가 시작될 인덱스, 복사할 갯수);

int[ ] origin = {1, 2, 3, 4, 5};
int[ ] copy = new int[10];
System.arraycopy(origin, 0, copy, 0, 5); // 1 2 3 4 5 0 0 0 0 0
System.arraycopy(origin, 0, copy, 3, 5); // 1 2 3 1 2 3 4 5 0 0
System.arraycopy(origin, 2, copy, 9, 2); //ArrayIndexOutOfBounds 10번방 없어!! >> 배열 범위 초과

for(int i = 0; i < copy.length; i++) {
System.out.print(copy[i] + " ");
} //배열 출력


** 방법3
copyOf() 사용
Arrays클래스에서 제공하는 copyOf()
[표현법] 복사본 배열 = Arrays.copyOf(원본배열이름, 복사할 갯수);

int[ ] origin = {1, 2, 3, 4, 5};
int[ ] copy = Arrays.copyOf(origin, 10); // 원본 배열보다 큰 값을 제시하면 복사본 배열에 공간 생성

for(int i = 0; i < copy.length; i++) {
System.out.print(copy[i] + " ");
} // 배열 출력 1 2 3 4 5 0 0 0 0 0

/*
* System.arraycopy( )
* : 몇 번 인덱스부터 몇 개를 어느 위치의 인덱스에 복사할 것인지 모두 지정 가능
*
* Arrays.copyOf( )
* : 무조건 원본배열의 0번 인덱스부터 복사가 진행(내가 지정한 갯수 만큼)
*
*/


** 방법 4
clone( );
[표현법] 복사본배열이름 = 원본배열이름.clone();

int[ ] origin = {1, 2, 3, 4, 5};
int[ ] copy = origin.clone( ); // 1 2 3 4 5
// 인덱스를 직접 지정x, 복사할 갯수 지정x => 원본 배열과 완전히 똑같다.