본문 바로가기

언어 기초/JAVA

[자바의정석 | Chapter 05 배열] 배열 예제3,4

1. 학습목표

배열의 복사에 대해 이해할 수 있다.

책에 있는 배열파트 예제는 모두 다루어보겠다.

2.필요 개념 문장정리

배열(array)의 복사

  • 배열을 복사하는 방법은 두가지가 있는데 for문을 이용해서 배열을 복사하는 방법은 기존 배열보다 2배인 배열을 생성하는 것이 좋다
  • int[] arr = new int[5];
    int[] tmp = new int[arr.length*2];
    for(int i = 0; i < arr.length; i++)
          tmp[i] = arr[i];
    arr = tmp;
  • 결국 참조변수 arr과 tmp는 같은 배열을 가리키게 된다. 배열 arr과 tmp는 이름만 다를 뿐 동일한 배열이다. 전의 arr배열은 더 이상 사용할 수 없다.
  • 다른 방법으로 System.arraycopy()를 사용하면 지정된 범위의 값들을 한 번에 복사한다.
  • for(int i = 0; i < num.length; i++) { newNum[1], num[i]}; 를
    System.arraycopy(num, 0, newNum, 0, num.length); 로 바꾸면 된다.
  • num[0]에서 newNum[0]으로 num.length개의 데이터를 복사한다는 의미이다.

 3. 코드작성

배열의 복사

class ArrayEX3 {
	public static void main(String[] args) {
    	int[] arr = new int[5];
        
        for(int i=0; i < arr.length; i++) {
        	arr[i] = i + 1;
            
        System.out.println("[변경전]");
        System.out.println("arr.length" + arr.length); 
        for(int i=0; i < arr.length; i++) {
        	System.out.println("arr["+i+"]:" + arr[i]);
        
        int[] tmp = new int[arr.length*2];
        
        for(int i=0; i < tmp.length; i++) {
        	tmp[i] = arr[i];
        
        arr = tmp;
        
        }
        
        System.out.println("[변경후]");
        System.out.println("arr.length" + arr.length);
        for(int i=0; i < arr.length; i++) {
        	System.out.println("arr["+i+"]:" + arr[i]);
	}
}   

실행결과
[변경전]
arr.length: 5
arr[0]: 1
arr[1]: 2
arr[2]: 3
arr[3]: 4
arr[4]: 5
[변경후]
arr.length: 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

 

System.arraycopy()의 사용

 

class ArrayEX4 {
	public static void main(String[] args) {
    	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);
		
        char[] result = new char[abc.length + num.length];
        System.arraycopy(abc, 0, result, 0, abc.length);
        System.arraycopy(num, 0, result, abc.length, num.length);
        System.out.println(result);
        
        System.arraycopy(abc, 0, num, 0, abc.length);
        System.out.println(num);
        
        System.arraycopy(abc, 0, num, 6, 3);
        System.out.println(num);  
    }       
}

실행결과
ABCD
123456789
ABCD123456789
ABCD456789
ABCDEF789
  1. System.out.println(abc); 및 System.out.println(num);: 배열을 직접 출력하면 배열의 내용이 연이어 출력됩니다.
  2. System.arraycopy: 배열의 일부분을 다른 배열로 복사합니다.
    • System.arraycopy(abc, 0, result, 0, abc.length);: abc 배열을 result 배열의 처음부터 복사합니다.
    • System.arraycopy(num, 0, result, abc.length, num.length);: num 배열을 result 배열의 abc.length 인덱스부터 복사합니다.
  3. System.out.println(result);: result 배열을 출력하면 abc 배열과 num 배열이 합쳐진 것을 확인할 수 있습니다.
  4. System.arraycopy(abc, 0, num, 0, abc.length);: abc 배열의 내용을 num 배열에 복사합니다. num 배열의 길이가 충분히 크기 때문에 오류 없이 복사됩니다.
  5. System.arraycopy(abc, 0, num, 6, 3);: abc 배열의 일부분을 num 배열의 인덱스 6부터 3개의 요소에 복사합니다. 따라서 num 배열의 일부가 변경됩니다.

4. 마무리

배열의 복사하기위해 for문과 arraycopy()메서드를 사용하는 방법을 이해할 수 있었다.