본문 바로가기
Java

Array-배열

by GGShin 2022. 5. 2.

배열은 동일한 타입의 변수들을 하나의 묶음으로 다룰 수 있도록 해주는 도구입니다.

일일이 변수를 만들지 않고도 많은 양의 데이터를 다룰 수 있기 때문에 상당히 편리하죠!

 

배열의 선언과 생성

배열을 선언하고 생성하는 방법은 다양한데, 많이 사용되는 몇가지 방법들은 다음과 같습니다.

1
2
3
4
//배열 선언
  int[] arr;
//배열 생성
  arr = new int[5];
cs

하지만 보통은 생성과 배열을 한 번에 진행합니다.

1
2
//배열 선언과 생성을 한번에
  int[] arr = new int[5];
cs

아래와 같이 생성 시에 데이터를 같이 생성할 수도 있습니다. (이 방법은 배열 변수를 선언할 당시에만 가능한 방법입니다.)

1
2
  int[] arr = {1,2,3,4,5};
cs

또 많이 사용되는 방법 중에 하나로는 for loop을 사용하는 방법도 있습니다. 

1
2
3
4
5
int[] arr = new int[5];
        
for(int i = 0; i < arr.length; i++) {
   arr[i] = i * 10;
}
cs

이렇게 선언과 생성을 하고 만든 배열의 모습을 보고 싶어서 System.out.println(arr);을 하면 

이런 요상한 문자가 나옵니다 🤔 (=> 자바의 정석에서 보니 타입@내부주소 라고 합니다!) 

for loop을 사용해서 배열의 0부터 마지막 요소까지 하나씩 프린트하는 방법도 있지만

Arrays.toString(arr)

단순히 내용을 보기 위해서라면 이렇게 해도 배열의 현재 상태를 볼 수 있습니다. 훨씬 간단하죠? (상황에 맞춰서 사용하면 됩니다!)

[0, 10, 20, 30, 40] 이렇게 잘 들어가 있는 것을 확인 할 수 있습니다.

 

배열  복사 & 크기 변경하기

Java에서는 배열을 생성할 때 그 크기를 지정해둡니다. 

만약에 예상보다 많은 양의 데이터를 넣어야 해서 중간에 크기를 변경해야 할 일이 생긴다면 어떻게 할까요?

 

1) for loop 이용하기

먼저 새로운 배열 참조변수를 선언하여 기존의 배열을 할당합니다. 그리고 기존 배열 참조변수에는 새로운 배열(크기를 늘려서)을 생성해줍니다. 이렇게 하면 배열의 크기가 늘어나게 됩니다. 그런 다음 기존의 데이터를 for loop을 이용해 새로운 배열 안에 넣어주면 됩니다.

아래 코드로 보시면 좀 더 이해하기가 쉬우실 겁니다.

결과도 제대로 나옴을 볼 수 있습니다. (index 5~8이 0인 이유는 아직 해당 인덱스에 데이터를 넣지 않아서 int의 default인 0이 들어가 있는 것입니다!)

 

2) Arrays.copyOf() 사용하기

또 다른 방법이 있는데, Arrays.copyOf() method를 사용할 수도  있습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
    public static void main(String[] args) {
 
        int[] myArr = {1,2,3,4,5};
        
       //Arrays.copyOf(변경할 array 참조변수 이름, 새로운 길이)
        int[] modified = Arrays.copyOf(myArr,6);
 
        System.out.println(Arrays.toString(modified)); //Prints [1, 2, 3, 4, 5, 0]
 
    }
}
cs

 

훨씬 간단하네요! Arrays.copyOf에 새로운 길이는 꼭 원래 배열의 길이보다 클 필요가 없습니다. 

myArr은 길이가 5인데, 만약 Arrays.copyOf(myArr, 4) 를 하게 된다면 에러가 나지 않고 [1, 2, 3, 4] 라는 배열을 반환합니다.

 

3) Arrays.copyOfRange() 사용하기

만약에 copy하고 싶은 구간을 설정하려면 Arrays.copyOfRange() method를 사용할 수 있습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
   public static void main(String[] args) {
 
       int[] myArr = {1,2,3,4,5};
 
       //Arrays.copyOfRange(변경할 array 참조변수 이름, 시작 인덱스(포함), 끝 인덱스(미포함))
       myArr = Arrays.copyOfRange(myArr,1,3);
       System.out.println(Arrays.toString(myArr)); //Prints [2, 3]
       
    }
}
 
cs

시작 인덱스는 포함이 되지만 끝 인덱스는 미포함된다는 사실만 잘 기억해 두면 될 것 같습니다.

 

만약에 끝 인덱스가 기존 myArr 배열의 길이보다 큰 수인 경우에는 자동으로 0으로 채워집니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
   public static void main(String[] args) {
 
       int[] myArr = {1,2,3,4,5};
 
       //myArr의 길이는 5인데, 끝 인덱스를 9로 설정
       //2,3,4,5는 myArr에서 복사하고 남은 수량(?)만큼은 초기값인 0으로 채워짐 
       myArr = Arrays.copyOfRange(myArr,1,9);
       System.out.println(Arrays.toString(myArr)); //Prints [2, 3, 4, 5, 0, 0, 0, 0]
 
    }
}
cs

Arrays.copyOfRange()는 마지막 인덱스를 어떻게 설정하냐에 따라서 일부 구간 복사만 될 수도 있고, 일부 구간 복사와 배열 크기 늘리기가 같이 될 수도 있겠습니다.

 

배열 복사하기

.Clone() 사용하기

해당 방법은 배열의 크기를 늘려주지는 못하고 복사만 가능합니다. 

 

1
2
3
4
5
int[] myArr = {1,2,3,4,5};
int[] clonedArr = myArr.clone();
 
System.out.println(Arrays.toString(clonedArr));
//Prints [1, 2, 3, 4, 5]
cs

 

이렇게 간단한 방법으로 복사만 할 수도 있습니다.

 

배열 간 일부 데이터 합치기

합친다는 말이 정확한 표현은 아닌 것 같지만 System.arraycopy()를 사용하면 한 배열의 일부 구간의 데이터로 다른 배열의 일부 구간 데이터를 대체할 수 있습니다.

예를 들어서, 

 

1
2
int[] myArr = {1,2,3,4,5};
int[] yourArr = {6,7,8,9,10,11};
cs

 

yourArr의 8,9,10 부분을 myArr의 2,3,4로 대체하고 싶을 때 System.arraycopy()를 사용하면 됩니다.

myArr의 데이터 일부를 youArr에 복붙하는 것입니다. 복붙이지만 yourArr의 배열의 길이를 늘리는 것은 아니기 때문에 yourArr에 있는 기존 데이터 일부는 없어지게 됩니다. 

 

1
2
3
4
5
6
int[] myArr = {1,2,3,4,5};
int[] yourArr = {6,7,8,9,10,11};
 
System.arraycopy(myArr,1,yourArr,2,3);
System.out.println(Arrays.toString(yourArr));
//Prints [6, 7, 2, 3, 4, 11]
cs

System.arraycopy(복사할 array 참조변수, 복사 시작 인덱스, 데이터 옮길 array 참조변수, 붙여넣기 시작 인덱스, 복사할 데이터 길이)

 

이렇게 parameter 설정해서 사용하면 됩니다.

 

 

위에서 배열의 크기를 변경하는 몇 가지 방법을 알아보았는데요,

해당 방법들 모두 아무래도 새로운 배열을 만들어서 데이터를 다시 할당하는 방법이기 때문에 데이터의 크기가 커질 수록 시간이 오래 걸리고 컴퓨터에게 힘든 작업이 되겠죠? 이런 수고로움을 덜기 위한 도구가 있는데 바로 ArrayList 입니다. 

 

다음번에는 ArrayList에 대해서 알아보도록 하겠습니다.

 

감사합니다 ☺️

반응형