본문 바로가기

개발일지/Java + Spring

211020 Java - Array 배열 복사 하는 방법과 메소드

총점과 평균 구하기 

	public static void main(String[] args) {
		int[] score = new int[] {100, 88, 100, 100, 90};
		int i, sum=0;
		double avg=0;
		
		for(i=0; i<score.length; i++)
		{
			sum+=score[i];
		}
		avg = (double)sum/score.length;
		
		System.out.printf("총점 : %d \n",sum);
		System.out.printf("평균 : %.1f",avg);
	}
총점 : 478 
평균 : 95.6

cnt++를 넣을 필요 없는 이유는 이미 우리는 배열의 크기를 알고있다! 

score.length가 배열의 크기 라서 나누면 됨!

(double)을 넣으면 타입 변형이 되어서 나누어진다

printf에서 출력할 때 소수자리는 %.1f

 

int[] score = {100, 88, 100, 100, 90};

선언할 때 이렇게 줄일 수 있다.

 


	public static void main(String[] args) {
		//각 5개 층에 기화 0을 넣어주면서, arr에 배열 시작 주소를 복사한다.
		int[] arr = new int[5];
		int i;
		
		//값을 넣어준다.
		for(i=0; i<arr.length; i++)
		{
			arr[i] = i + 1;
		}
		System.out.println("[변경전]");
		System.out.printf("arr.lenth : %d \n", arr.length);
		
		for(i=0; i<arr.length; i++)
		{
			System.out.printf("arr[%d] : %d \n", i, arr[i]);
		}
		
		//별도의 두 배 사이즈(10) 배열을 새로 생성
		//참조형 변수는 자바가 알아서 초기화(0)를 해준다.
		// = 연산자를 통해서 위처럼 할당을 받는다. 주소값을 가짐
		int[] tmp = new int[arr.length * 2];
		
		
		//배열의 값 복사. 원래는 메소드를 지원해준다.
		//arr.length까지 하는 이유는 복사를 해야하니까
		for(i=0; i<arr.length; i++)
		{
			tmp[i] = arr[i];
			//내용 복사
		}
		
		//복사한 것을 넣어준다.
		// tmp가 가지고 있는 시작 주소값을 arr에 뒤집어 씌운다. 
		// 그래서 arr과 tmp는 같은 주소값을 갖고 있는다.
		arr = tmp;
		
		System.out.println();
		System.out.println("[변경후]");
		System.out.printf("arr.lenth : %d \n", arr.length);
		
		for(i=0; i<arr.length; i++)
		{
			System.out.printf("arr[%d] : %d \n", i, arr[i]);
		}
	}
[변경전]
arr.lenth : 5 
arr[0] : 1 
arr[1] : 2 
arr[2] : 3 
arr[3] : 4 
arr[4] : 5 

[변경후]
arr.lenth : 10 
arr[0] : 1 
arr[1] : 2 
arr[2] : 3 
arr[3] : 4 
arr[4] : 5 
arr[5] : 0 
arr[6] : 0 
arr[7] : 0 
arr[8] : 0 
arr[9] : 0 

 

int[] tmp = new int[arr.length * 2];

arr[]의 두 배로 새로운 배열을 만들어준다.

 

		for(i=0; i<arr.length; i++)
		{
			tmp[i] = arr[i];
			//내용 복사
		}

arr[i]의 값을 tmp[i] 안에 넣어준다.

그 뒤로는 0값을 넣는다.

참조형 변수는 값을 자동으로 초기화 해주기 때문에 0을 넣는 것임

int의 기본값이 0이기 때문에 

 

arr = tmp;

둘 다 배열명이다. 배열명은 배열의 첫번째 주소값을 갖고 있다. 

arr에 tmp를 대입하면 tmp의 첫번째 주소값이 arr에 복사가 된다.

이말인즉슨 같은 곳을 가리키게 된다. (주소값이 같음!)

그래서 arr[]을 출력하면 tmp의 값이 나오게 되는 것이다~~

 

그렇다면...

원래 있던 arr의 값은?

자바의 강점인 Garbage Collector(GC)가 나중에 알아서 쓰레기 값을 처리 해준다.

메모리에서 없애준다는 뜻! 

 

		tmp[3] = 33;
		System.out.printf("arr[3] : %d \n", arr[3]);
		
		arr[9] = 99;
		System.out.printf("tmp[9] : %d \n", tmp[9]);

		
		System.out.println();
		for(i=0; i<arr.length; i++)
		{
			System.out.printf("arr[%d] : %d \n", i, arr[i]);
		}
arr[3] : 33 
tmp[9] : 99 

arr[0] : 1 
arr[1] : 2 
arr[2] : 3 
arr[3] : 33 
arr[4] : 5 
arr[5] : 0 
arr[6] : 0 
arr[7] : 0 
arr[8] : 0 
arr[9] : 99 

 

같은 곳을 바라보고(주소값이 같음) 있기 때문에 하나가 바뀌면 모두 바뀌는 것이다. 

 


클래스 = 객체 = 인스턴스

다 같은 말이고 어느 관점에서 보냐에 따라서 조금씩 다른 말임


		char[] abc = {'A', 'B', 'C', 'D' };
		char[] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
		
		System.out.println(abc);
		System.out.println(num);
		
		//배열 abc
		char[] result = new char[abc.length + num.length];
		//14만큼 잡아 넣음. 시작주소가 들어가있다. 
		System.arraycopy(abc, 0, result, 0, abc.length);
		//abc시작주소 인덱스0부터 어디에다가 result 배열의 시작주소의 0번째부터 몇 개를 복사할거야? abc.length
		System.arraycopy(num, 0, result, abc.length, num.length);
		//result 현재는 abc.length까지 복사가 돼 있으니 [4]부터 시작을 한다.
		//복사할 대상? 어디서부터? 어디에 복사를 하나? 어디서부터?, 어디까지?
		
		
		System.out.println(result);
		
		/*
		for(int i=0; i<abc.length; i++)
		{
			result[i] = abc[i];
		}
		*/
ABCD
0123456789
ABCD0123456789

 

char[] result = new char[abc.length + num.length];

char타입의 result 배열을 생성한다.

char[ ] 대괄호 안에는 보통 숫자가 들어가는데

abc.lenth + num.lenth가 들어가면 둘을 합친 값을 생성한다는 뜻이다.

결과적으로 char[] result는 14 크기 만큼 방을 잡은 것이다.

result에 직접적으로 방이 있는 게 아니라 그 방의 주소값이 입력된다.

 

 

 

System.arraycopy() 

이 메소드는 배열 복사를 위한 메소드이다.

 

5가지 순서대로
복사할 대상 / 그 대상의 어디서부터? / 어디에다가 복사를? /

복사가 될 예정인 대상의 몇번째부터? / 어디까지 복사를 할 거냐

 

System.arraycopy(abc, 0, result, 0, abc.length);

abc의 [0]부터 복사를 합니다.

result의 [0]부터 abc의 크기 만큼요.

 

System.arraycopy(num, 0, result, abc.length, num.length);

num의 [0]부터 복사를 합니다.

result에 복사를 하는 대신

abc 크기부터 시작을 해서 num.length의 크기 만큼 복사한다.

 

System.out.println(result);

result를 출력하면 abc+num 값이 복사 돼서 나오는 것임

 

'개발일지 > Java + Spring' 카테고리의 다른 글

211021 java - 다차원 배열과 객체  (0) 2021.10.21
211020 Java - 시험 풀이  (0) 2021.10.20
211019 Java - Array  (0) 2021.10.19
211019 Java - while  (0) 2021.10.19
JAVA 211019 - today  (0) 2021.10.19