본문 바로가기

코딩/JAVA 공부

[JAVA] 자바의 정석 _ Arrays

* 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