* Arrays
- 배열을 다루기 편리한 메서드(static) 제공. (utill 메서드)
1. 배열의 출력 - toString() : 배열을 문자열로 반환해줌.
2. 다차원의 배열 출력 - deepToString()
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]]
3. 배열의 복사 - copyOf(), coptOfRange() : 새로운 배열을 생성해서 반환.
4. 배열 채우기 - 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);// arr = [1, 5, 2, 1, 1]
// 람다식! 추후에 배울 예정.
5. 배열의 정렬 - sort() : 배열을 정렬함.
6. 배열의 검색 - binarySearch() : 이진 탐색. 정렬 이후 검색 필수.
int[] arr = {3, 2, 0, 1, 4};
int idx = Arrays.binarySearch(arr, 2); // idx = -5 잘못된 결과
// binarySearch()는 이진탐색으로 반드시 정렬한 후 사용해야함
Arrays.sort(arr); // 배열 arr 정렬 arr = [0, 1, 2, 3, 4]
int idx = Arrays.binarySearch(arr,2); // idx = 2
7. 다차원 배열의 비교 - deepEquals() (1차원 배열은 equals() 사용하면 됨)
String[][] str2D = new String[][]{{"aaa", "bbb"}, {"AAA", "BBB"}};
String[][] str2D2 = new String[][]{{"aaa", "bbb"}, {"AAA", "BBB"}};
Arrays.equals(str2D, str2D2); // false
Arrays.deepEquals(str2D, str2D2); // true
8. 배열을 List로 변환 - asList(Object a) : 가변 매개변수 사용 가능! 개수가 정해져 있지 않다.
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는 읽기 전용. 즉 변경 불가
List list = new ArrayList(Arrays.asList(1,2,3,4,5)); // 이렇게 하면 변경 가능!
위 코드에서 읽기 전용으로 만들어진 리스트는 객체가 생성된 건 아닌 건가?
asList의 반환형을 보면 알 수 있을 듯!
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
} // Arrays 에서 asList 코드
리턴은 ArrayList이다. 처음에 이게 ArrayList인줄 알고 헷갈렸지만, 이 ArrayList는 Arrays 클래스 내부 클래스 이름으로,
List를 implements 한 ArrayList와는 다른 것 이다!
즉 읽기전용 List list = Arrays.asList() 로 호출한 것은 객체가 생성된건 아니다.
** 향상된 for문
for (int x=0; x<arr.length;x++){
int i = arr[x];
}
---------------------- //두 개 for문은 같은 것! 향상된 for문 good!
for(int i : arr){
}
* Comparable & Comparator
- 객체 정렬에 필요한 메서드 (정렬 기준 제공)를 정의한 인터페이스
Comparable: 기본 정렬 기준을 구현하는 데 사용
Comparator: 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 때 사용
public interface Comparator{
int compare(Object o1, Object o2); // o1, o2 두 객체를 비교
boolean equals(Object obj); // equals 오버라이딩 하란 뜻
}
public interface Comparable{
int compateTo(Object o); // 주어진 객체(o)를 자신과 비교
}
정렬할 때 정렬 기준을 줘야함! 그때 사용.
public final class Integer extends Number implements Comparable{
....
public int compareTo(Object o){ // 오버로딩
return compareTo((Integer)o));
}
public int compareTo(Integer anotherInteger){
int v1 = this.value;
int v2 = anotherIntefer.value;
// 같으면 0, 오른쪽이 크면 1, 작으면 -1 반환
return (v1 < v2 ? 1:(v1==v2? 0 : -1)); // v1 - v2 해도 됌? 3항 영상자가 성능 더 빠름.
} // compateTo end
} // Integer end
- String에서 정렬하기
String에서 정렬 기준을 CASE_INSENSITIVE_ORDER로 정할 수 있다.
String 코드를 보면, 이는 상수로 내부 클래스인 CaseInsensitiveComparator()를 호출하며,
이 클래스는 Comparator를 implements 한다.
즉! compare 메서드를 오버라이딩 한다! (그런데 equals는 오버라이딩 안 했는데,,?)
이는 대, 소문자 구분 없이 사전 순 정렬 기준이며. 이렇게 자주 사용하는 정렬 기준은 클래스에 있다.
public static final Comparator<String> CASE_INSENSITIVE_ORDER // sort 메서드에서 사용하기 위해 Comparator 참조형?
= new CaseInsensitiveComparator();
private static class CaseInsensitiveComparator
implements Comparator<String>, java.io.Serializable {
....
}
---------------------------------------
String[] arr = {"car", "Dog", "lion", "tiger"};
Arrays.sort(arr); // 디폴트 기준인 comparable에 의한 정렬 (arr의 클래스에 comparable이 구현되 있어야 함)
Arrays.sort(arrm String.CASE_INSENSITIVE_ORDER); // 지정한 Comparator에 의한 정렬
- Integer에서 정렬하기
Comparable은 구현돼있음. (기본적으로 비교 가능한 class들은 Comparable 구현 (위 코드 보기))
- 정렬 기준을 sort에 넣기
정렬 방법은 이미 최적화되어있고, 기준만 주면 됨.
static void sort(Object[] objArr, Comparator c){
for(int i=0; i<objArr.length-1;i++){
for(int j=0; j<objArr.length-1-i;j++){
Object tmp = null;
if(c.compare(objArr[j], objArr[j+1])>0){
tmp = objArr[j];
objArr[j] = objArr[j+1];
objArr[j+1] = tmp;
} // if
} // for j
} // for i
} // sort'코딩 > JAVA 공부' 카테고리의 다른 글
| [JAVA] 자바의 정석 _ HashMap & Hashtable, Collections (0) | 2022.10.16 |
|---|---|
| [JAVA] 자바의 정석 _ HashSet, TreeSet (0) | 2022.10.16 |
| [JAVA] 자바의 정석 _ Collection Framework/ List(ArrayList, LinkedList), Stack, Queue, Iterator (0) | 2022.10.14 |
| [JAVA] 자바의 정석 _ Calendar, 형식화 클래스 (0) | 2022.10.13 |
| [JAVA] 자바의 정석 _ Object, String, StringBuffer, StringBuilder, Math 클래스 / 오토박싱, 언박싱 (0) | 2022.10.12 |