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)
'자료구조_알고리즘 > 자료구조_Java' 카테고리의 다른 글
[JAVA/자료구조] Map / HashMap / Hashtable (0) | 2023.06.06 |
---|---|
[JAVA/자료구조] DEQUE 데크 (양방향 큐) (0) | 2023.06.06 |
[JAVA/자료구조] Queue 큐 (0) | 2023.06.05 |
[JAVA/자료구조] Stack 스택 (0) | 2023.06.04 |
[JAVA/자료구조] 컬렉션(Collection) 프레임워크 (0) | 2023.02.07 |