[Java] - Iterator / Comparator / Comparable

janjanee·2021년 6월 28일
0

Java

목록 보기
14/17
post-thumbnail

Iterator

컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다.
참고로 Enumeration은 Iterator의 구버전이고, ListIterator는 Iterator의 기능을 향상 시킨 것이다.

  • 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화
  • Collection 인터페이스에 'Iterator를 반환하는 iterator()'를 정의
    • Collection 인터페이스의 자손인 List와 Set에 포함
  • Iterator를 얻은 뒤, 주로 while문을 사용해서 컬렉션 클래스 요소를 읽음
메소드설명
boolean hasNext()읽어 올 요소가 남아있는지 확인
Object next()다음 요소를 읽어온다.

아래는 ArrayList에 저장된 요소를 출력하는 예제이다.

Collection<String> c = new ArrayList<>();   //  다른 컬렉션으로 변경시 이 부분만 변경하면 된다.

c.add("hello");
c.add("world");
c.add("happy");

Iterator<String> it = c.iterator();

while(it.hasNext())
    System.out.println(it.next());

컬렉션을 읽는 방법을 Iterator를 이용해서 표준화했기 때문에
만약 HashSet으로 변경하고 싶으면 첫 번째 줄만 변경하면 된다.
Collection<String> c = new HashSet<>();

참조변수가 Collection 타입이기 때문에 그 아래 나머지 코드는 검토하지 않아도 된다.

Map 인터페이스를 구현한 컬렉션 클래스는 키(key)와 값(value)을 쌍으로 저장하고 있기 때문에
iterator()를 직접 호출할 수 없다.

대신 keySet() 이나 entrySet() 과 같은 메소드를 통해서 키와 값을 각각 따로 Set의 형태로 얻은 후
다시 iterator()를 호출하면 된다.

Map<String, String> map = new HashMap<>();
Iterator<String> it = map.keySet().iterator();

Comparator / Comparable

객체 정렬에 필요한 메소드(정렬기준)를 정의한 인터페이스

Comparable 기본 정렬기준을 구현하는데 사용.
Comparator 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용

public interface Comparable<T> {
    public int compareTo(T o);
}

public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}

Comparable과 Comparator의 실제 소스코드이다.
compare()과 compareTo() 는 두 객체를 비교하는 같은 기능을 가진 메소드이다.

  • 두 객체가 같으면 - 0
  • 비교하는 값보다 작으면 - 음수
  • 비교하는 값보다 크면 - 양수

위의 조건으로 반환하도록 각 메소드를 구현해야 한다.

참고로 equals 메소드는 Comparator를 구현하는 클래스에서 오버라이딩이 필요할 수 있다는 것을
알리기 위해 정의된 것이다.

다음은 사용예제이다.

public class ComparatorEx {
    public static void main(String[] args) {
        String[] strArr = {"jpa", "spring", "java", "csharp", "Nodejs"};

        Arrays.sort(strArr);    //  String Comparable 구현에 의한 정렬
        print(strArr);

        Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
        print(strArr);

        Arrays.sort(strArr, new Descending());
        print(strArr);

    }

    private static void print(String[] strArr) {
        System.out.println("strArr=" + Arrays.toString(strArr));
    }

}

class Descending implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        return o2.compareTo(o1);
    }
}
  • Arrays.sort(strArr);
    • 현재 객체(String)에 구현된 Comparable을 기준으로 정렬된다.
  • Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
    • 대소문자를 구분하지 않고 비교하는 Comparator(정렬기준)를 제공
  • Arrays.sort(strArr, new Descending());
    • 문자열을 역순으로 정렬하는 Descending Comparator 클래스 구현

References

  • 남궁성, 『자바의 정석』, 도우출판(2016)
profile
얍얍 개발 펀치

0개의 댓글