아래의 내용은 java_grammer 레파지토리 C01Basic 디렉터리에 저장되어있는 내용을 정리하였다.
자바 배열은 같은 타입의 여러 값을 연속된 공간에 저장 하는 자료구조이며, 길이가 고정 이라는 특징이 있음.
기본적인 선언 방식은 세 가지가 있음
// (1) 길이만 먼저 지정
int[] arr1 = new int[5]; // 기본값으로 0으로 초기화
// (2) 리터럴 방식
int[] arr2 = {10, 20, 30, 40, 50};
// (3) 명시적 배열 생성 방식
int[] arr3 = new int[]{10, 20, 30, 40, 50};
특징을 정리하면 아래와 같음.
ArrayList 같은 컬렉션 사용) length - 1 까지만 유효 ArrayIndexOutOfBoundsException 발생 배열을 다른 메서드의 인자로 넘길 때는 new int[]{...} 형태로 명시적으로 새 배열 객체를 만들어 넘길 수 있음.
List<int[]> myList = new ArrayList<>();
myList.add(new int[5]);
myList.add(new int[]{10, 20, 30, 40, 50});
이처럼 배열은 고정 길이 + 동일 타입 이라는 제약이 있지만, 반복 처리, 합계/평균, 최대·최소값 탐색 등 기본 알고리즘 구현에 가장 많이 사용되는 기본 자료구조임.
int[] arr1 = new int[5];
arr1[0] = 10;
arr1[1] = 20;
arr1[3] = 40;
arr1[4] = 50;
배열은 선언 시 기본값으로 초기화됨.
int → 0 boolean → false 다른 초기화 방식도 가능함.
int[] arr2 = {10, 20, 30, 40, 50};
int[] arr3 = new int[]{10, 20, 30, 40, 50};
리터럴 방식과 명시적 방식이 있음. 리터럴 방식은 선언 시, 명시적 방식은 다른 메서드 인자로 전달할 때 주로 씀.
Arrays.sort() 메서드를 사용하면 배열을 쉽게 정렬할 수 있음.
기본은 오름차순이며, Comparator.reverseOrder()로 내림차순 정렬 가능.
String[] stArr = {"abc", "aaa", "acd", "add"};
Arrays.sort(stArr);
Arrays.sort(stArr, Comparator.reverseOrder());
선택정렬은 성능이 좋은 편은 아니지만, 알고리즘 이해에 도움이 됨.
int[] sortArr = {17, 12, 20, 10, 15};
for (int i = 0; i < sortArr.length; i++) {
int minIdx = i;
for (int j = i + 1; j < sortArr.length; j++) {
if (sortArr[minIdx] > sortArr[j]) {
minIdx = j;
}
}
int temp = sortArr[i];
sortArr[i] = sortArr[minIdx];
sortArr[minIdx] = temp;
}
O(n^2)O(n log n)데이터가 많아질수록 내장 정렬 함수의 효율성이 훨씬 높다.
배열에서 원하는 값을 찾는 방법으로는 두 가지가 있다.
모든 값을 순차적으로 돌며 검사한다. 복잡도는 O(n).
int[] findArr = {1, 3, 6, 8, 9, 11, 15};
int target = 11;
int targetIdx = -1;
for (int i = 0; i < findArr.length; i++) {
if (findArr[i] == target) {
targetIdx = i;
break;
}
}
정렬된 배열에서만 사용 가능하며, 데이터를 절반씩 나눠가며 찾는다. 복잡도는 O(log n).
int targetIdx2 = Arrays.binarySearch(findArr, 11);
값이 없을 때는 음수값을 반환한다.
== 연산자는 참조 비교, Arrays.equals()는 값 비교를 수행한다.
int[] arr1 = {10, 20, 30};
int[] arr2 = {10, 20, 30};
System.out.println(arr1 == arr2); // false
System.out.println(Arrays.equals(arr1, arr2)); // true
배열을 복사할 때는 Arrays.copyOf() 또는 Arrays.copyOfRange()를 사용한다.
int[] arr = {1, 4, 6, 7, 8};
int[] copy1 = Arrays.copyOf(arr, 4);
int[] copy2 = Arrays.copyOfRange(arr, 2, 5);
Arrays.fill()을 사용하면 배열을 특정 값으로 한 번에 채울 수 있다.
String[] fillArr = new String[5];
Arrays.fill(fillArr, "");
2차원 배열은 배열 안에 배열이 들어 있는 구조다.
int[][] multiArr = new int[3][4];
int num = 1;
for (int i = 0; i < multiArr.length; i++) {
for (int j = 0; j < multiArr[i].length; j++) {
multiArr[i][j] = num++;
}
}
출력 시 Arrays.deepToString()을 사용해야 내부 값이 보인다.
Java에서는 2차원 배열의 각 행 길이가 다를 수 있다. 이를 가변 배열이라 한다.
int[][] jaggedArr = new int[3][];
jaggedArr[0] = new int[2];
jaggedArr[1] = new int[3];
jaggedArr[2] = new int[4];
System.out.println(Arrays.deepToString(jaggedArr));
Fill arr?
아르르르르르륵 ㅋㅋ 콱 ㅋㅋ!!