일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 알고리즘
- 신입사원
- 공채
- 프로그래밍
- 신입
- 깃허브
- package-private
- 우리카드
- 스프링
- 뮤텍스
- 이펙티브 자바
- 컴퓨터과학
- 스터디
- 메모리
- OS
- 컴퓨터공학
- IT
- 디지털
- CS
- github
- java
- 자바
- spring
- Public
- 깃
- 세마포어
- 정보처리기사
- 운영체제
- 개발
- Effective Java
- Today
- Total
주니어 개발자 성장기
Comparable과 Comparator 본문
개요
Comparable과 Comparator은 둘다 interface
로서 Comparable은 자기 자신과 매개변수 객체를 비교하는 것이고 Comparator는 두 매개변수 객체를 비교하는 것이다.
공통점
둘 다 int 값을 반환한다. 반환 값이 양수인 경우, 앞의 객체(Comparable의 경우 this)가 순서상으로 뒤로 위치하게 된다. 0은 동등함을 의미하며 음수인 경우, 두 객체의 순서가 바뀌지 않는다.
Comparator
Comparator 는 자연스러운 순서가 없는 개체 컬렉션에 대한 순서를 제공하는 비교 기능으로서, 이 클래스의 구현체는 compare()
를 override
해야 한다. 앞서 말했듯 compare(Object A, Object B)
와 같이 두 개의 인자를 받아서 int 값을 반환한다. 두 개의 매개 변수를 비교하는 것이다.
람다
람다 표현식으로 간결하게 사용할 수 있다.
Collections.sort(list, (a, b) -> a - b);
사용처
순서 정렬이 필요한 경우에 인자로서 전달하는 방식으로 사용된다.
Collections.sort()
PriorityQueue<>()
Comparable
Comparable
은 자기 자신과 다른 객체를 비교하는 interface
다. compareTo(Object A)
로 한 개의 매개변수를 받아 this
와 비교해 int 값을 반환한다. 즉, Comparable
인터페이스를 적용하기 위해서는 비교하고자 하는 객체의 클래스가 Comparable
를 구현하고 있어야 한다.
왜 비교 인터페이스가 2개나 존재할까?
Comparable
은 어떤 객체의 기본 순서를 지정하는데 쓰일 수 있다.반면 Comparator
를 사용하는 이유는 3가지가 있다.
- 정렬하고자 하는 대상의 소스코드를 직접 수정할 수 없는 경우
- 정렬하고자 하는 대상 클래스의 비교 코드(
Comparable
)을 추가하고 싶지 않을 때 - 여러 가지 정렬 전략을 세우려고 할 때(
Comparable
은 1개만 가능)
사용시 유의점
위와 같이 return a - b
와 같이 구현한다면 오버플로우
가 발생할 수 있으므로 큰 숫자를 다룰 때는 다음과 같이 구현하는 것이 좋다. (자세한 내용은 Baeldung에서 확인하는 것을 추천한다.)
@Override
public int compare(Integer a, Integer b) {
if (a > b)
return 1;
else if (a == b)
return 0;
return -1;
}
'Java' 카테고리의 다른 글
함수형 인터페이스 (0) | 2023.08.07 |
---|---|
(22.09.08)Java는 call by reference를 쓰지 않는다. (0) | 2022.09.08 |