일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 스프링 mvc프로젝트가 안뜰때
- getMessage()
- 파일을 읽을 수 없을때
- 예외 발생
- printStackTrace()
- chained exception
- 멀티 catch 블럭
- POST요청
- throw e
- 빨간파일
- 예외발생
- 깃베쉬
- unchecked예외
- 설치에러
- 인텔리제이
- 포트충돌
- 이클립스
- 사용자 정의 예외
- 빨간폴더
- exception re-throwing
- 인텔리제이물음표파일
- checked예외
- mvc project 생성
- arrays메서드
- source root
- 예외처리
- 소스루트설정
- mark directory as
- 자바클래스가 안보일때
- 색상에 따른 상태
- Today
- Total
프로그래밍 스티치
Arrays의 메서드 본문
Arrays의 메서드
Arrays크래스에는 배열을 다루는데 유용한 메서드가 정의되어 있다. 같은 기능의 메서드가 배열의 타입만 다르게 오버로딩 되어 있어 많아보이지만, 실제로는 그리 많지 않다! 같은 메서드를 배열의 타입별로 일일이 설명할 필요는 없으므로, 매개변수의 타입이 int배열인 메서드에 대한 사용법만 살펴보자.
Arrays에 정의된 메서드는 모두 static 메서드이다. ( Object, Math, Collections 또한 동일! )
배열의 복사 - copyOf(), copyOfRange()
copyOf()는 배열 전체를
copyOfRange()는 배열의 일부를 복사해서 새로운 배열을 반환한다!
int[] arr = {0,1,2,3,4};
int[] arr2 = Arrays.copyOf(arr, arr.length); //arr2=[0,1,2,3,4]
int[] arr3 = Arrays.copyOf(arr, 3); //arr3=[0,1,2]
int[] arr4 = Arrays.copyOf(arr, 7); //arr4=[0,1,2,3,4,0,0]
int[] arr5 = Arrays.copyOfRange(arr, 2, 4); //arr5=[2,3]
int[] arr6 = Arrays.copyOfRange(arr, 0, 7); //arr6=[0,1,2,3,4,0,0]
copyOfRange의 지정된 범위의 끝은 포함되지 않는다.
항상 <= < 의 범위를 가짐 ( 자바 언어에서만 이러는지는 아직 모르겠으나 자바의 여러부분에서 범위를 지정하는 메서드는 대부분 이러한 계산법을 가짐 )
비슷하게 생긴 System.arrayCopy는 어떤, 어떻게 기능을 할까?
System.arraycopy는 byte[]형태의 데이터를 자르거나 연접하기위해 사용되는 메서드로서 매개변수로는 자그마치 5개나 받는다. 그 구조를 살펴보면
System.arraycopy(src, srcPos, dest, destPos, length) 인데 하나하나 뜯어보자
Object SRC : 복사하고자하는 소스, 즉 원본이라고 생각하면 된다.
int srcPos : 위의 원본 소스에서 어느 부분부터 읽어올지 위치를 정해준다. 처음부터 데이터를 읽으려면 0을 넣어준다.
Object dest : 복사할 소스, 복사하려는 대상
int destPos : 위의 복사본에서 자료를 받을 때, 어느 부분부터 쓸 것인지 시작위치를 정해준다.
int length : 원본에서 복사본으로 데이터를 읽어서 쓸 데이터의 길이.
어떠한 부분에서 사용되면 좋을지 예를 확인해보자.
1.기본방식
public static void main(String[] args) {
int[] a = new int[5];
int[] b = new int[5];
for(int i = 0; i < a.length; i++) {
a[i] = i;
}
System.arraycopy(a, 0, b, 0, a.length);
for(int e : b) {
System.out.print(e+" ");
}
}
// 출력 : 0 1 2 3 4
2. 2차원 배열 -> 1차원배열
public static void main(String[] args) {
int[][] a = new int[5][5];
int[] b = new int[a.length * a.length];
for(int i = 0; i < a.length; i++) { //데이터를 넣는 부분
for(int j = 0; j < a.length; j++) {
a[i][j] = i;
}
}
for(int i = 0; i < a.length; i++) { //배열 복사
System.arraycopy(a[i], 0, b, i * a.length, a.length);
}
for(int e : b) {
System.out.print(e+" ");
}
}
3. 리스트 -> 배열
public static void main(String[] args) {
List<Integer> al = new ArrayList<Integer>();
Integer[] b = new Integer[5];
for (int i = 0; i < b.length; i++) { // 데이터를 넣는 부분
b[i] = i;
}
al = (List<Integer>) Arrays.asList(b); // 배열 -> 리스트 복사
for (int e : al) {
System.out.print(e + " ");
}
}
// 0 1 2 3 4
작은 데이터면서 자료형이 같을 때는 clone 방식의 복사가 개인적으론 더 편하다고 생각합니다. 하지만 데이터가 대량이면서 부분부분 복사할 일이 있을 때는 System.arraycopy를 사용하는 것을 추천합니다.
다시돌아와서 arrays의 메서드를 마저 알아보자
배열 채우기 - fill(), setAll()
fill()은 간단하다 배열의 모든 요소를 지정된 값으로 채운다.
setAll()은 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받는다. 이 매서드를 호출할 때는 함수형 인터페이스를 구현한 객체를 매개변수로 지정하던가 아니면 람다식을 지정해야한다. 아직 람다식에 대해서 배우지 않았으므로 후에 학습을 진행한 후 돌아와서 보충설명 하겠습니다.
int[] arr = new int[5]
Arrays.fill(arr, 9); // arr[9,9,9,9,9]
Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1); // 랜덤하게 값이 배정
배열의 정렬과 검색 - sort(), binaraySearch()
sort()는 배열을 정렬할때 사용
binarySearch()는 배열에 저장된 요소를 검색할때 사용한다
단! binarySearch()를 사용할때는 배열이 정렬된 상태이어야 올바른 결과를 얻을 수 있다! (sort()가 선실행이 되어야해)
int[] arr = {3,2,0,1,4};
int idx = Arrys.binarySearch(arr, 2); // idx = -5 <- 잘못된 결과 도출
Arrays.sort(arr); // 배열arr을 정렬
System.out.println(Arrys.toString(arr)); // [0,1,2,3,4]
int idx = Arrays.binarySearch(arr,2); // idx = 2 <-올바른 결과 도출
++
배열의 첫번째 요소부터 순서대로 하나씩 검색하는 것을 '순차 검색(linear search)'이라고 하는데, 이 검색 방법은 배열이 정렬되어 있을 필요는 없지만 배열의 요소를 하나씩 비교하기 때문에 시간이 많이 걸린다.
문자열의 비교와 출력 - equals(), toString()
toString()으로 배열의 모든 요소를 문자열로 편하게 출력!
하지만 다차원 배열에는 deepToString()을 사용해야 한다. deepToString()은 배열의 모든 요소를 재귀적으로 접근해서 문자열을 구성하므로 2차원 뿐만 아니라 3차원 이상의 배열에도 동작
int[] arr = {0,1,2,3,4};
int[][] arr2D = {{11,12}, {21,22}};
System.out.println(Arrays.toString(arr)); // [0,1,2,3,4]
System.out.println(Arrays.deepToString(arr2D)); // [[11,12],[21,22]]
equals()는 두 배열에 저장된 모든 요소를 비교해서 같으면 true를, 다르면 false를 반환한다.
마찬가지로, 다차원 배열의 비교에는 deepEquals()를 사용한다.
String[][] str2D = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};
String[][] str2D2 = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};
System.out.println(Arrays.equals(str2D, str2D2)); //false
System.out.println(Arrays.deepEquals(str2D, str2D2)); //true
배열을 List로 변환 - asList(Object... a)
asList()는 배열을 List에 담아서 반환한다. 매개변수의 타입이 가변인수(인수의 개수와 타입이 정해지지않음)라서 배열 생성없이 저장할 요소들만 나열하는 것도 가능하다.
++ 가변매개변수여서 여러개 넣어도 상관없다! 아래 예시 2번째줄 참조
List list = Arrays.asList(new Integer[]{1,2,3,4,5}); //list = [1,2,3,4,5]
List list = Arrays.asList(1,2,3,4,5); // list = [1,2,3,4,5]
list.add(6); //UnsupportedOperationException 예외 발생
3번째 줄에서 예외가 발생하는 이유는 list는 읽기전용이라 변경이 안된다 만약 크기를 변경할 수 있는 List가 필요하다면 다음과 같이 하면 된다.
List list = new ArrayList(Arrays.asList(1,2,3,4,5));
위와 같이 하면 새로운 ArrayList가 복사되어 새로운 리스트가 만들어진다
parallelXXX(), spliterator(), stream()
이 메서드들은 보다 빠른 결과를 얻기위해서 여러 쓰레드가 작업을 나누어 처리하도록 한다.
아직 학습이 이뤄지지 않았으므로 후에 보충설명하러 돌아오겠습니다.
'JAVA > 컬렉션 프레임워크' 카테고리의 다른 글
HashSet으로 변환하면 왜 오름차순이 되는걸까? (0) | 2022.02.09 |
---|---|
컬렉션 프레임워크 (0) | 2022.02.07 |