HSRyuuu 2023. 4. 20. 13:19

1. 배열이란?


  • 동일한 자료형(Type)의 데이터를 하나의 연속된 공간에 저장하는 자료구조이다.
  • 각 데이터의 저장 위치는 index(0부터 시작)를 부여해 접근한다.
  • 정해진 크기의 메모리를 먼저 할당받아 사용한다. 즉, 선언할 때 크기를 미리 지정해야한다.
  • 한번 선언하면 이후에 크기를 변경할 수 없다.
  • 비어있는 인덱스가 존재해서는 안된다.
  • 만약 특정한 값으로 초기화하지 않은 배열 안의 데이터를 참조하면 예외 발생한다.


인덱스(index)

인덱스는 배열의 각 저장 위치를 가리키는 0부터 1씩 증가하는 값이다.
배열 이름 옆에 대괄호[ ]에 기입한다.

int[] arr = new int[5];

arr이라는 이름의 배열이 있고, 5개의 저장공간을 갖는다.
첫번째 저장공간의 값을 가져올때는 arr[0], 두번째는 arr[1], 세번째는 arr[2]...와 같이 표현한다.

크기가 5이면 항상 마지막 인덱스는 크기 - 1 인 4이다.

 


배열의 장점

인덱스를 이용하여 데이터에 빠르게 접근할 수 있다.

배열은 연속된 공간에 저장되기 때문에 한번 배열의 데이터에 접근하면 같은 배열의 다른 데이터에 접근할때 빠르게 접근 할 수있다.

배열의 단점

데이터의 추가, 삭제, 변경, 배열의 크기 변경 등이 유연하지 않다.

  • 배열을 선언할 때 크기를 한번 정하면 수정할 수 없다.
  • 만약 배열의 길이를 늘려야한다면 새로운 길이를 가진 새로운 배열을 생성하여 기존 배열의 데이터를 옮겨줘야 한다.
  • 데이터 삭제 시, 해당 인덱스의 빈 공간을 유지한다.

 

2. 배열 선언 방법


1) 크기를 지정하여 선언 후 값 입력

가장 많이 사용하는 방법이다.

int[] arr1 = new int[3];
arr1[0] = 100;
arr1[1] = 200;
arr1[2] = 200;

2) 배열 선언과 동시에 초기값 대입

int arr2[] = { 100, 200, 300, 400 };

3) 배열 선언과 동시에 new 연산자와 함께 초기값 대입

int arr3[] = new int[] { 100, 200, 300 };

4) 배열 선언을 먼저 한 뒤 초기값 대입

int arr4[];
arr4 = new int[] { 100, 200 };

5) 2차원 배열 초기화 1

int[][] arr1 = new int[3][4];

6) 2차원 배열 초기화 2

int[][] arr2 = { { 1, 2, 3, 4 },
                { 5, 6, 7, 8 },
                { 9, 10, 11, 12 } };

배열 변수는 참조변수 이므로 배열이 생성되기 전 null로 초기화가 가능하다.
그러나 null 값을 가진 상태의 배열안의 데이터를 참조하면 Null Pointer Exception가 발생하기 때문에, 초기화를 확실히 하는것이 좋다.


Default  값( 초기값 )

  • int : 0
  • String : null
  • boolean : false
  • double : 0.0

3. 예제로 배열 다루기


1) 초기화

  • 아래와 같이 크기가 10인 배열을 선언하고, 반복문으로 배열에 일일히 값을 넣어 초기화 할 수 있다.
int[] arr = new int[10];

for(int i=0;i<10;i++){
	arr[i] = i+1;
}

2) 인덱스

위의 예제에서 arr[] 배열의 10개의 index에 각각 1부터 10까지 넣어서 초기화 해봤다.
이제 배열을 초기화 했으니, 배열의 각 index의 값을 꺼내보자.
`arr[0]` = 1 , `arr[1]` = 2 . . . `arr[9]` = 10 가 담겼을 것이다.

배열의 데이터를 모두 더하는 예제를 만들어보자.

int sum = 0;

for(int i=0;i<10;i++){
    sum+=arr[i];
}

3) arr.length

배열의 길이는 arr.length로 알수 있다.
위의 예제를 바꿔보자.

int sum = 0;
for(int i=0;i<arr.length;i++){
    sum+=arr[i];
}

(결과는 동일하다.)

4) 향상된 for문

배열의 요소를 하나씩 순회하며 값을 뽑아내는 향상된 for문을 사용할수도 있다.

int sum = 0;
for(int x : arr){
    sum+=x;
}

5) String 형 배열

배열은 동일한 data type의 묶음이다. 따라서 int 형 뿐만 아니라 String, boolean, 심지어 다른 자료구조도
담을 수 있다.

String[] strArr = {"Hello", "World", "!!"};

System.out.println(strArr[0]+strArr[1]+strArr[2]);

출력 : HelloWorld!!

 

4. 배열 복사


방법 1) 똑같이 복사 clone()

int[] arr = {1,2,3};
int[] copyArr = arr.clone();

방법 2) Arrays.copyOf()

Arrays.copyOf(원본 배열, 복사할 길이)

int[] array = {1,2,3,4,5,6,7};
int[] arr = Arrays.copyOf(array, array.length);

방법 3) Arrays.copyOfRange()

Arrays.copyOfRange(원본배열, start, end) : start부터 end바로 앞까지 복사

int[] array = {1,2,3,4,5,6,7};
int arr[] = Arrays.copyOfRange(array,2,5);
//결과 : [3,4,5]

방법 4) System.arraycopy()

System.arraycopy(원본배열, 원본시작인덱스, 타겟배열, 타겟시작인덱스, 복사개수)

int[] array = {1,2,3,4,5,6,7};
int[] arr = new int[array.length];
System.arraycopy(array, 0, arr, 0, arr.length)
//    array에서 / array[0]부터 / arr로 복사/ arr[0]부터 / 7개(arr.length) 

 

반응형