개요
자바에서 가장 애용하는 자료구조가 있는데요, 바로 우선 순위 큐입니다. 우선 순위 큐는 정렬 기준을 커스텀 할 수 있기 때문에 정말 다양한 곳에서 사용 가능한데요, 처음에 나름(?) 진입 장벽이 있었던 자료구조였지만 이제는 저에게 있어서 없어서는 안되는 자료구조가 되었습니다. 우선 순위 큐를 사용할 때는 다음과 같이 정렬 기준을 커스텀 했습니다.
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2){
return o1 - o2;
}
});
Java
복사
어려웠던 구조도 자주 사용하다 보면 익숙해지기 나름인데요, 최근에 자바의 소양을 키우기 위해 모던 자바 인 액션 이라는 서적을 구매해서 읽고 있는데 여기서는 람다의 편의성을 매우 강조했습니다.
평소에 람다의 멋짐(?) 을 꽤나 동경하고 있던 저로서는 이 기회에 Comparator 또한 람다를 써서 구현해보고자 합니다!
기본 구조
만약 위 코드를 람다식으로 변환하면 어떻게 나타낼까요? 의외로 형태는 비슷합니다.
PriorityQueue<Integer> pq = new PriorityQueue<>(
(o1, o2) -> return o1 - o2;
});
Java
복사
보시면 알겠지만 new Comparator 나 public int compare 가 사라진채 람다 파라미터, 화살표 그리고 바디로 구성되어 있습니다.
(o1, o2) : 람다 파라미터
→ : 화살표
return o1 - o2; : 바디
그런데 파라미터의 타입이 생략되어 있죠? 원래는 Integer o1, Integer o2으로 표현했는데 말입니다. 이는 람다 표현식은 컴파일러가 문맥으로 부터 파라미터의 타입을 유추할 수 있기 때문입니다.
복잡한 구조
람다 표현식은 복잡한 구조에서 더 힘을 발휘합니다. 예를 들어, 다음과 같은 클래스가 있다고 가정해봅시다.
class Conference {
private int start;
private int end;
public Conference(int start, int end){
this.start = start;
this.end = end;
}
}
Java
복사
그리고 처음에는 start의 오름 차순으로 정렬하고 만약 start 값이 같다면 end의 오름차순으로 정렬한다고 가정해봅시다. 이는 다음과 같이 나타낼 수 있습니다.
PriorityQueue<Conference> pq = new PriorityQueue<>((c1, c2) -> {
int startComparison = Integer.compare(c1.start, c2.start);
if (startComparison != 0) {
return startComparison;
}
return Integer.compare(c2.end, c1.end);
});
Java
복사
람다 표현식은 Comparator 말고도 여러 곳에 사용될 수 있습니다. 하지만 오늘 포스팅에서는 Comparator에 대해서만 간략하게 알아보았습니다!