반응형
반응형
해당 글의 목적은 주요 배열 조작함수(기본 배열 구성 및 Arrays)를 이해하고 예제를 통한 이해를 돕기 위해 작성한 글입니다. 해당 글에서는 모든 함수에 대해서는 포함하고 있지 않으며 자주 사용되는 함수 위주로 작성하였습니다. (상시 업데이트 예정입니다)
1) 배열 초기 구성
1. 배열 초기화
💡 배열을 구성하고자 할 때 최초 배열의 “사이즈”를 지정해야 배열을 구성할 수 있습니다. 또한 배열의 사이즈 지정 및 값을 초기화해 줄 수 있습니다. ( * Collection 함수의 ArrayList는 동적으로 사이즈 지정이 가능하여서 별도의 사이즈를 지정하지 않아도 된다는 차이점이 있습니다)
- 배열 선언 및 생성 : [예시] String[] strArr = {};
- 배열의 사이즈 지정 : [예시] String[] strArr2 = new String [3];
- 배열의 요소 지정(초기화): [예시] String [] strArr3 = {"one", "two", "three"};
// 1. '사이즈'와 '값'이 둘다 없는 빈 배열
String[] strArr = {};
// 2. '사이즈'는 존재하지만 '값'이 없는 빈 배열
String[] strArr2 = new String[3];
// 3. '사이즈'가 자동 지정된 '값'이 있는 배열
String[] strArr3 = {"one", "two", "three"};
// 4. 빈 배열에 값 넣기
String[] strArr4 = new String[3];
strArr4[0] = "one";
strArr4[1] = "two";
strArr4[2] = "three";
// 5. 빈 배열 -> 사이즈 할당 -> 값 넣기
String[] strArr5 = {};
strArr5 = new String[3];
for (int i = 0; i < strArr5.length; i++) {
strArr3[i] = Integer.toString(i);
}
2. 배열 요소 삽입 및 추출
💡 배열의 사이즈를 지정하여서 배열을 구성하였다면, 해당 배열 내에 요소들을 삽입을 하고 추출을 할 수 있습니다.
// [CASE1] 배열의 사이즈 지정과 동시에 값 할당
String[] initStrArr = {"one", "two", "three", "four", "five"};
log.debug(Arrays.toString(initStrArr)); // ["one", "two", "three", "four", "five"]
// [CASE2] 배열 선언 및 각각의 값 할당
String[] initStrArr2 = new String[3];
initStrArr2[0] = "apple";
initStrArr2[1] = "banana";
initStrArr2[2] = "cherry";
log.debug(Arrays.toString(initStrArr2)); // [apple, banana, cherry]
3. [참고] 배열과 Collection 함수 간의 전환 : Array To ArrayList / ArrayList To Array
💡 Array를 Collection 함수인 ArrayList로 전환을 하거나 ArrayList를 Array로 전환하는 방법에 대해서 알아봅니다.
💡 Array는 정적으로 초기에 사이즈를 지정해야 배열을 구성할 수 있으나 ArrayList는 초기에 사이즈를 지정할 필요 없고 동적으로 사이즈를 지정하여 배열을 구성할 수 있습니다.
💡 Array는 length()로 배열의 사이즈를 확인하고 ArrayList는 size()로 배열의 사이즈를 확인할 수 있습니다.
// 1. Array Initialize
String[] strArr = {"one", "two", "three"};
// 1.1. [배열 -> 컬렉션 함수] 배열 리스트(ArrayList) 선언 및 초기화합니다.
List<String> strArrList = new ArrayList<>(Arrays.asList(strArr)); // ArrayList : ["one", "two", "three"]
// 1.2.1 [컬렉션 함수 -> 배열] 사이즈 지정 및 배열 리스트 값을 전환.
strArr = strArrList.toArray(new String[strArrList.size()]); // String[] : ["one", "two", "three"]
// 1.2.2 [컬렉션 함수 -> 배열] 사이즈 지정 및 배열 리스트 값을 전환.
for (int j = 0; j < integerList.size(); j++) {
strArr[j] = strArrList.get(j); // String[] : ["one", "two", "three"]
}
2) Arrays를 이용한 배열 조작
💡 해당 Arrays는 별도의 패키지(import java.util.Arrays)를 import하여서 사용이 됩니다.
1. 요약
분류 | 메서드 명 | return type | 설명 |
배열 변환 | Arrays.asList(array) | List<T> | 해당 메서드는 배열(Array)을 기반으로 Collection 함수의 ArrayList로 형변환을 하여 반환해주는 함수입니다. |
배열 복사 | Arrays.copyOf(array, copyArrayLenght) | T[] | 해당 메서드는 배열 전체를 복사하여서 복사할 길이 만큼 지정하여 복사한 새로운 배열로 반환해주는 함수입니다. |
배열 복사 | Arrays.copyOfRange(array, startIntex, endIndex) | T[] | 해당 메서드는 원본 배열의 시작 인덱스와 끝 인덱스를 지정하여서 복사한 새로운 배열로 반환해주는 함수입니다. |
배열 채우기 | Arrays.fill(array, n) | void | 해당 메서드는 배열내에 지정한 범위 내에 “동일한 값”으로 채워주는 함수입니다. |
배열 채우기 | Arrays.setAll(array, generator) | void | 해당 메서드는 배열을 채우는데 사용하는 배열이며, 배열의 값은 순차적으로 메서드로 “구성한 값”으로 채워주는 함수입니다. |
배열 값 출력 | Arrays.toString(array) | String | 해당 메서드는 배열을 문자열로 변환하여 반환해주는 함수입니다. |
배열 정렬 | Arrays.sort(array) | void | 해당 메서드는 배열내의 요소들을 오름차순/내림차순, 특정 구간을 정하여 정렬을 수행해주는 함수입니다. |
배열 간의 비교 | Arrays.equals(array1, array2); | boolean | 해당 메서드는 두 배열이 “동일한 수”의 요소를 포함하고 두 배열이 모든 해당 “요소 쌍의 값이 동일한지”에 대해 비교하여 진위형(boolean)으로 반환해주는 함수입니다. |
배열 간의 비교 | Arrays.deepEquals(array1, array2) | boolean | 해당 메서드는 단일 차원 또는 다차원 배열의 두 배열이 같은지 여부를 비교하여 진위형(boolean)으로 반환해주는 함수입니다. 또한 차원에 관계없이 두 개의 중첩 배열(즉, 다차원 배열)을 비교할 수 있습니다. |
배열 요소 검색 | Arrays.binarySearch() | int (index) | 해당 메서드는 배열의 요소를 검색하여 해당 요소의 인덱스를 반환해주는 함수입니다. |
[참고] Java Arrays Class 설명
2. 배열 변환 : Arrays.asList(array)
💡 해당 메서드는 배열(Array)을 기반으로 Collection 함수의 ArrayList로 형변환을 하여 반환해 주는 함수입니다.
// 1. [배열 -> 컬렉션 함수] 배열(Array) 선언 및 초기화합니다.
String[] strArr = {"one", "two", "three"};
// 2. [배열 -> 컬렉션 함수] 배열 리스트(ArrayList) 선언 및 초기화합니다.
List<String> strArrList = new ArrayList<>(Arrays.asList(strArr)); // ArrayList : ["one", "two", "three"]
// 1. [컬렉션 함수 -> 배열] 배열(Array) 사이즈 지정합니다.
String[] strArr2 = new String[strArrList.size()];
// 2. [컬렉션 함수 -> 배열] 배열(Array) - 배열리스트 값을 전환합니다.
strArr2 = strArrList.toArray(strArr2); // String[] : ["one", "two", "three"]
[참고] Array.asList()에 대한 추가 설명
3. Arrays.copyOf(array, copyArrLength)
💡 해당 메서드는 배열 전체를 복사하여서 복사할 길이만큼 지정하여 복사한 새로운 배열로 반환해 주는 함수입니다.
💡 원본의 배열의 사이즈를 넘어가면 0의 값으로 채워줍니다.
int[] arr = {0, 1, 2, 3, 4};
// 동일한 배열을 복사합니다.
int[] newArray1 = Arrays.copyOf(arr, arr.length); // [0, 1, 2, 3, 4]
int[] newArray2 = Arrays.copyOf(arr, 3); // [0, 1, 2]
int[] newArray3 = Arrays.copyOf(arr, arr.length + 3); // [0, 1, 2, 3, 4, 0, 0, 0]
[참고] Array.copyOf()에 대한 추가 설명
4. Arrays.copyOfRange(array, startIntex, endIndex)
💡 해당 메서드는 원본 배열의 시작 인덱스와 끝 인덱스를 지정하여서 복사한 새로운 배열로 반환해 주는 함수입니다.
💡 원본의 배열의 사이즈를 넘어가면 0의 값으로 채워줍니다.
int[] arr = {0, 1, 2, 3, 4};
int[] copyArrIdx = Arrays.copyOfRange(arr, 0, arr.length + 2); // [0, 1, 2, 3, 4, 0, 0]
[참고] Arrays.copyOfRange()에 대한 추가 설명
[참고] Array.copyOf()와 Array.copyOfRange() 비교
분류 | Arrays.CopyOf() | Arrays.copyOfRange |
복사 시작 인덱스 지정 가능 여부 | O | O |
복사 끝 인덱스 지정 가능 여부 | X | O |
복사 사이즈 초과시 값 채워줌 여부 | O | O |
5. Arrays.fill(array, value) / Arrays.fill(array, startIndex, endIndex, value)
💡 해당 메서드는 배열 내에 지정한 범위 내에 “동일한 값”으로 채워주는 함수입니다.
/*
* Arrays.fill : 해당 메서드는 배열내에 지정한 동일한 값으로 채워주는 함수입니다.
*/
// [CASE1] 모든 빈 공간에 채워주는 fill
int[] fillArr1 = new int[5];
Arrays.fill(fillArr1, 369); // [369, 369, 369, 369, 369]
// [CASE2] 2,3,4 공간에 해당 값을 채워주는것과 같지만 모두 다 채워준다.
int[] fillArr2 = new int[5];
fillArr2[0] = 123;
fillArr2[1] = 456;
fillArr2[2] = 789;
Arrays.fill(fillArr2, 369); // [369, 369, 369, 369, 369]
// [CASE3] 특정 구간에 채워주는 방식 (시작 인덱스와 종료인덱스 입력)
int[] fillArr3 = new int[5];
fillArr3[0] = 123;
fillArr3[1] = 456;
fillArr3[2] = 689;
Arrays.fill(fillArr3, 3, fillArr3.length, 369); // [123, 456, 689, 369, 369]
// [CASE4] fill 함수와 repeat 함수를 사용하여 순차적인 별 채워넣기
String[] fillArr4 = new String[5];
for (int i = 0; i < fillArr4.length; i++) {
Arrays.fill(fillArr4, i, i + 1, "*".repeat(i + 1)); // "*", "**", "***", "****", "*****"
}
// [CASE5] 배열의 길이보다 더 채워주는 경우 => 에러 발생 : Array index out of range: 8
int[] fillArr5 = new int[5];
fillArr5[0] = 123;
fillArr5[1] = 456;
fillArr5[2] = 689;
Arrays.fill(fillArr5, 3, fillArr5.length + 3, 369); // Array index out of range: 8
[참고] Array.filll()에 대한 추가 설명
6. Arrays.setAll(array, generator)
💡 해당 메서드는 배열을 채우는 데 사용하는 배열이며, 배열의 값은 순차적으로 메서드로 “구성한 값”으로 채워주는 함수입니다.
// [CASE1] setAll을 통해 배열 내에 변형된 숫자를 채워넣는다. : 100까지 랜덤한 숫자들로 배열을 채워 넣는다
int[] arr1 = new int[5];
Arrays.setAll(arr1, i -> (int) (Math.random() * 101); // 64, 17, 69, 56, 6
// [CASE2] setALL을 통해 배열 내에 변형된 문자을 채워 넣는다. : 별을 순차적으로 증가시켜 배열에 추가를 합니다.
String[] arr2 = new String[5];
Arrays.setAll(arr2, i -> "*".repeat(i + 1)); // ["*", "**", "***", "****", "*****"]
[참고] Array.setAll()에 대한 추가 설명
[참고] Arrays.fill()와 Arrays.setAll() 비교
분류 | Arrays.fill() | Arrays.setAll() |
변형 데이터의 반영 가능 여부 | X | O |
7.Arrays.toString(array)
💡 해당 메서드는 배열을 문자열로 변환하여 반환해 주는 함수입니다.
/*
* Arrays.toString : 해당 메서드는 배열을 문자열로 변환해주는 함수입니다.
*/
int[] orgArr = {0, 1, 2, 3, 4}; // [0, 1, 2, 3, 4]
String arrToStr = Arrays.toString(arr); // "[0, 1, 2, 3, 4]",
[참고] Array.toString()에 대한 추가 설명
8. Arrays.sort(array)
💡 해당 메서드는 배열 내의 요소들을 오름차순/내림차순, 특정 구간을 정하여 정렬을 수행해 주는 함수입니다.
💡 해당 정렬한 배열은 해당 메모리 내에서 유효합니다.
💡 해당 메서드를 이용하여서 내림차순, 오름차순, 특정 구간의 정렬이 가능합니다.
1. 숫자 배열의 정렬
/*
* 숫자 배열의 정렬
*/
Integer[] sortNumArr1 = {0, 1, 2, 3, 4};
Integer[] sortNumArr2 = {10, 11, 1, 2, 4};
// [CASE1] 숫자 오름차순 정렬 -1 : 오름차순으로 정렬이 됩니다.
Arrays.sort(sortNumArr1); // [0, 1, 2, 3, 4]
Arrays.sort(sortNumArr2); // [1, 2, 4, 10, 11]
// [CASE2] 숫자 오름차순 정렬 -2 : 오름차순으로 정렬이 됩니다.
Arrays.sort(sortNumArr1, Comparator.naturalOrder()); // [0, 1, 2, 3, 4]
Arrays.sort(sortNumArr2, Comparator.naturalOrder()); // [1, 2, 4, 10, 11]
// [CASE3] 숫자 내림차순 정렬 -1 : 내림차순으로 정렬이 됩니다.(* 해당 주의 사항은 Wrapper Class 를 이용하여야 합니다.)
Arrays.sort(sortNumArr1, Collections.reverseOrder()); // [4, 3, 2, 1, 0]
Arrays.sort(sortNumArr2, Collections.reverseOrder()); // [11, 10, 4, 2, 1]
// [CASE4] 숫자 내림차순 정렬 -2 : 내림차순으로 정렬이 됩니다.(* 해당 주의 사항은 Wrapper
Arrays.sort(sortNumArr1, Comparator.reverseOrder()); // [4, 3, 2, 1, 0]
Arrays.sort(sortNumArr2, Comparator.reverseOrder()); // [11, 10, 4, 2, 1]
// [CASE5] 숫자 인덱스 범위 정렬 : 시작 인덱스와 종료 인덱스를 선택하여서 정렬이 됩니다.
Arrays.sort(sortNumArr1, 0, 3); // [1, 10, 11, 2, 4]
Integer[] sortNumArr3 = {10, 11, 1, 2, 4};
// [CASE5] 숫자 내림차순 정렬 : Lambda를 이용한 내림 차순으로 정렬
Arrays.sort(sortNumArr3, (s1, s2) -> s2 - s1); // [11, 10, 4, 2, 1]
// [CASE6] 숫자 오름차순 정렬 : Lambda를 이용한 오름 차순으로 정렬
Arrays.sort(sortNumArr3, (s1, s2) -> s1 - s2); // [1, 2, 4, 10, 11]
2. 문자열 배열의 정렬 : 대소문자 구분하여 정렬
/*
* 문자열의 정렬-1 : 대소문자를 구분하여 정렬하는 방식
*/
String[] sortStrArr1 = {"strawberry", "Strawberry", "mango", "Mango", "cherry", "Cherry", "banana", "Banana", "apple", "Apple"};
// [CASE1] 문자 정렬 : 오름차순으로 정렬합니다.
Arrays.sort(sortStrArr1); // [Apple, Banana, Cherry, Mango, Strawberry, apple, banana, cherry, mango, strawberry]
// [CASE2] 문자 정렬 : 내림차순으로 정렬이 됩니다. (* 해당 주의 사항은 Wrapper Class 를 이용하여야 합니다.)
Arrays.sort(sortStrArr1, Collections.reverseOrder()); // [strawberry, mango, cherry, banana, apple, Strawberry, Mango, Cherry, Banana, Apple]
3. 문자열 배열의 정렬 : 대소문자 구분 없이 정렬
/*
* 문자열의 정렬-2 : 대소문자 구분없이 정렬하는 방식
*/
String[] sortStrArr2 = {"strawberry", "Strawberry", "mango", "Mango", "cherry", "Cherry", "banana", "Banana", "apple", "Apple"};
// [CASE1] 문자 정렬 : 오름차순으로 정렬합니다. : 대소문자 구분 O
Arrays.sort(sortStrArr2, String.CASE_INSENSITIVE_ORDER); // [apple, Apple, banana, Banana, cherry, Cherry, mango, Mango, strawberry, Strawberry]
// [CASE2] 문자 정렬 : 내림차순으로 정렬합니다. : 대소문자 구분 O
Arrays.sort(sortStrArr2, Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER)); // [strawberry, Strawberry, mango, Mango, cherry, Cherry, banana, Banana, apple, Apple]
[참고] Array.sort()에 대한 추가 설명
9. Arrays.equals(array1, array2) : 1차원 배열
💡 해당 메서드는 두 배열이 “동일한 수”의 요소를 포함하고 두 배열이 모든 해당 “요소 쌍의 값이 동일한지”에 대해 비교하여 진위형(boolean)으로 반환해 주는 함수입니다.
/*
* Arrays.equals : 해당 메서드는 두 배열이 동일한 수의 요소를 포함하고 두 배열이 모든 해당 요소 쌍이 동일한지에 대한 비교를 수행합니다.
*/
int[] arr1 = {1, 2, 3, 4};
int[] arr2 = {1, 2, 3, 4};
int[] arr3 = {1, 2, 4, 3};
boolean isEquals1 = Arrays.equals(arr1, arr2); // true
boolean isEquals2 = Arrays.equals(arr1, arr3); // false
[참고] Array.equals()에 대한 추가 설명
10. Arrays.deepEquals(array1, array2) : 단일 차원 또는 다차원 배열
💡 해당 메서드는 단일 차원 또는 다차원 배열의 두 배열이 같은지 여부를 비교하여 진위형(boolean)으로 반환해 주는 함수입니다. 또한 차원에 관계없이 두 개의 중첩 배열(즉, 다차원 배열)을 비교할 수 있습니다.
int a1[][] = {{10, 20}, {40, 50}, {60, 70}};
int a2[][] = {{30, 20}, {10, 0}, {60, 80}};
int a3[][] = {{10, 20}, {40, 50}, {60, 70}};
boolean isDeepEquals1 = Arrays.deepEquals(a1, a2); // false
boolean isDeepEquals2 = Arrays.deepEquals(a1, a3); // true
[참고] Array.deepEquals()에 대한 추가 설명
[참고] Arrays.equals()와 Arrays.deepEquals() 비교
분류 | Arrays.equals() | Arrays.deepEquals() |
1차원 배열 비교 여부 | O | O |
다차원 배열 비교 여부 | X | O |
11. Arrays.binarySearch()
💡 해당 메서드는 배열의 요소를 검색하여 해당 요소의 인덱스를 반환해주는 함수입니다.
[참고] Array.binarySearch()에 대한 추가 설명
오늘도 감사합니다. 😀
반응형
'Java > 공통 모듈' 카테고리의 다른 글
[Java] Stream API -3 이해하기: Stream 최종연산 (0) | 2023.02.14 |
---|---|
[Java] Stream API -2 이해하기: Stream 중간연산 (4) | 2023.02.08 |
[Java] Stream API -1 이해하기: 용어 및 Stream 생성 (4) | 2023.02.05 |
[Java] 문자열(String) 조작 함수 이해하기 : 조작 및 비교 함수 (2) | 2023.01.21 |
[Java] 숫자(Number) 조작 함수 이해하기 : Math, 진법 변환 (2) | 2023.01.14 |