JAVA/java 실습

[자바JAVA] 일차원 배열 - 배열 복사방법 for문, arraycopy, Arrays.copyOf, Arrays.copyOfRange

자바칩 프라푸치노 2020. 9. 28. 07:37

안녕하세요

이번에는 일차원 배열의 복사 방법을 알아보겠습니다.

 

1. for문을 이용한 배열 복사

2. arraycopy를 이용한 배열 복사

3. Arrays.copyOf 를 이용한 배열 복사

4. Arrays.copyOfRange 를 이용한 배열 복사

순서대로 알아보겠습니다.

 

첫번째로 for문을 이용한 배열 복사 방법 입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package sec01_firstArray;
 
import java.util.Arrays;
 
public class Array_Ex5 {
    //배열 복사(직접적으로 복사를 하는 방법)
    public static void main(String[] args) {
        //원본 배열
        int[] arr = new int[5];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i +1;
            } //5개의 방에 1,2,3,4,5 저장됨
        System.out.println("변경전 - arr.length : " + arr.length);
        System.out.println(Arrays.toString(arr));
        System.out.println("-------------------------------");
        
        //타겟배열
        int[] temp = new int[arr.length*2]; //10개 방을 가진 temp배열 생성
        System.out.println("temp: " + temp.length);
        //배열복사(1번째 방법) - for 문을 이용한 직접적 방법
        for (int i = 0; i < arr.length; i++) {
            temp[i] = arr[i];
            //5번째 까지 arr배열과 같은 값 저장
        }
        
        System.out.println(Arrays.toString(temp));
        System.out.println("-------------------------------");
        
        System.err.println("주소값 변경 전");
        System.out.println("arr 주소: " + arr);
        System.out.println("temp 주소: " + temp);
        System.out.println("-------------------------------");
        
        arr = temp; //temp의 주소가 arr로 들어가서 arr의 주소가 temp가 됨.
        
        System.out.println("-------------------------------");
        System.err.println("주소값 변경 후 ");
        System.out.println("arr 주소: " + arr); //arr의 주소와 temp의 주소가 같아짐
        System.out.println("temp 주소: " + temp);
        System.out.println("-------------------------------");
        
        System.out.println("변경후 - arr.length : " + arr.length);
        System.out.println(Arrays.toString(arr));
        
        
        
    }
 
    
}
 
cs

 

코드를 하나씩 살펴보겠습니다.

①int배열 arr에 5개의 방을 만들고

②for문을 통해 방에 순서대로 1~5를 저장하고 있습니다.

③arr.length는 5이구요

④Arrays.toString(arr) 은 배열을 순서대로 나열하여 나타내줍니다.

 

출력결과 입니다.

다음 코드를 보시면

 

①int배열 temp에 arr보다 2배 긴 배열을 만듭니다. 그럼 10개의 방이 생성되었습니다.

②temp.length는 10이구요

③for문을 이용해서 temp[0]부터 순서대로 arr의 값들을 넣어줍니다.

그럼 arr.length가 끝난 인덱스 5부터는 초기화를 해주지 않았으니 0이 들어가게 됩니다.

④Arrays.toString(arr) 은 배열을 순서대로 나열하여 나타내줍니다.

 

 

그 다음 코드를 보시면 

①② 에서 둘의 주소값은 당연히 다르겠죠!

그 이유는 new연산자를 통해서 새로운 객체를 생성해주었기 때문입니다.

메모리 공간에서는 

이렇게 만들어 집니다.

 

③에서 temp의 주소값을 arr에게 넘겼습니다.

그럼

이렇게 arr이 원래 객체와의 관계를 끊고

temp가 가리키는 객체의 주소를 들고 있게 되겠습니다.

그럼 원래 arr이 가리키던 길이 5인 배열은 쓰레기 객체가 됩니다.

 

④⑤ 에서 주소값은 temp의 주소값으로 동일하게 출력됩니다.

 

⑥ 변경 후 arr의 length는 temp배열과 같아지므로 length는 10입니다.

출력결과입니다.

 


배열 복사 두번째 방법인

arraycopy 사용입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
import java.util.Arrays;
 
public class Array_Ex6 {
    
    public static void main(String[] args) {
        //배열 복사 방법(2번째)
        //원본배열
        char[] abc = new char[] {'A''B''C''D'};
        char[] num = new char[] {'0''1''2''3''4''5''6''7'};
        System.out.println("------------------------------------");
        
        
        //배열 복사방법(2번째) --> arraycopy 사용
        System.out.println(abc);
        System.out.println(num);//char[]은 안에 값을 그대로 출력
 
        //타겟배열--> abc와 num 길이를 합친만큼 타겟배열을 생성한다.
        char[] result = new char[abc.length + num.length];
        System.out.println("result의 길이 : " + result.length);
        System.out.println("result의 초기값 : " + Arrays.toString(result));//유니코드
        
        //abc : 원본배열, 0: abc배열의 0번째 인덱스.(어디서 부터 복사할건지)
        //result : 타겟배열
        //0 : 타겟배열의 인덱스(어디서부터 붙여넣을 것인지)
        // abc.length : 4만큼 복사
        System.arraycopy(abc, 0, result, 0, abc.length);
        System.out.println("result배열에 abc배열을 복사한 후 \n : " + Arrays.toString(result));
        
        System.arraycopy(num, 0, result,  abc.length, num.length);
        System.out.println("result배열에 num배열을 추가 복사한 후 \n : " + Arrays.toString(result));
        
        System.out.println("------------------------------------");
        
        
    }
 
    
}
 
cs

코드를 살펴보겠습니다.

원본배열을 선언해주었습니다.

abc의 길이는 4

num의 길이는 8 입니다.

원래 배열을 출력하면 주소값이 나오는데 char배열은 안의 값이 그대로 출력됩니다.

다음에는 배열 복사를 해줄 배열하나를 만듭니다.

result배열은 abc와 num을 합친 길이만큼 생성하니 12 길이를 갖게 됩니다.

초기값 출력을 하기 위해 Arrays.toString을 사용했습니다.

char형의 기본값으로 초기화가 되었습니다.

 

arraycopy() 가 나왔습니다.

자세히 살펴보시면 

arraycopy하고 

순서대로 abc, 0, result, 0, abc.length

를 입력하였습니다.

1. abc -> 원본배열 ( 무슨 배열을 복사할 것인지)

2. 0 -> 원본배열의 몇번째 인덱스 부터 복사를 할 것인지

3. result -> 어디다가 붙여넣을 것인지

4. 0-> 붙여넣는 배열의 몇 번 째 익덱스 부터 붙여넣을 것인지

5. abc.length-> 원본배열에서 몇개를 복사를 할 것인지

 

정리하면 abc배열의 0번째 인덱스 부터 abc배열 전체다를 

result배열의 0번째 인덱스에 붙여넣겠다.

이런 말입니다.

그러면 result는 길이 12짜리 배열인데

4만큼 복사해서 붙여넣었으니

배열이 

A, B, C, D, , , , , , , ,  

이렇게 되었겠습니다.

 

그 다음은

1. 원본배열 num 에서 

2. 0번쨰 인덱스 부터 복사

3. 타겟배열 result에 

4. abc.length인덱스 부터 붙여넣을 것임 ( 4인덱스 부터 )

5. num의 길이 전체다 복붙할 것임

 

그렇게 하여 이렇게 나왔습니다.


세번째 방법 

Arrays.copyOf를 사용하여 복사하는 방법입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
import java.util.Arrays;
 
public class Array_Ex6 {
    
    public static void main(String[] args) {
        //배열 복사 방법(2번째)
        //원본배열
        char[] abc = new char[] {'A''B''C''D'};
        char[] num = new char[] {'0''1''2''3''4''5''6''7'};
        System.out.println("------------------------------------");
        
        
        //배열 복사방법(2번째) --> arraycopy 사용
        System.out.println(abc);
        System.out.println(num);//char[]은 안에 값을 그대로 출력
 
        //타겟배열--> abc와 num 길이를 합친만큼 타겟배열을 생성한다.
        char[] result = new char[abc.length + num.length];
        System.out.println("result의 길이 : " + result.length);
        System.out.println("result의 초기값 : " + Arrays.toString(result));//유니코드
        
        //배열 복사 방법(3번째) --> Arrays클래스 이용        // abc : 원본배열
        // abc.length : 얼마만큼 복사할 것인지.
        char[] tarArr = Arrays.copyOf(abc, abc.length);
        System.out.println("tarArr배열에 abc배열을 복사한 후 \n : " + Arrays.toString(tarArr));
        
        
        //copyOfRange()는 끝인덱스는 포함하지 않는다.
        // num배열을 인덱스2번부터 4번까지 복사
        char[] tarArr1 = Arrays.copyOfRange(num,2,5);
        System.out.println("tarArr배열에 num배열의 인덱스 2~5까지 복사한 후 \n : " + Arrays.toString(tarArr1));
            }
 
    
}
 
cs

나머지는 다 똑같고 새로운 방법을 살펴봅니다.

타겟배열 tarArr을 만들어주고

바로 Arrays.copyOf를 했씁니다.

그리고 순서대로 abc, abc.length가 나왔습니다.

1. abc -> 원본배열( 무슨 배열을 복사할것인지)

2. abc.length -> 얼만큼 복사할 것인지

를 나타내는 것입니다.

그러면 abc배열을 전체다 복사해서 tarArr을 만든다는 소리겠습니다.

 


 

배열 복사 4번쨰 방법

Arrays.copyOfRange이용입니다.

 

Arrays.copyOfRange에 순서대로 num ,2 , 5가 나왔습니다.

1. 원본배열 num을 복사

2. 몇번째 부터 -> 2번째 인덱스 부터

3. 4번째 인덱스 까지 복사(5를 적으면 마지막 5인덱스는 포함하지 않고 복사됩니다.)

 

728x90