반응형
번외편 - Java Comparator vs JavaScript sort()
개발하다 보면 이런 코드를 자주 본다.
Java
users.sort(
(u1, u2) ->
Integer.compare(
u1.getAge(),
u2.getAge()
)
);
JavaScript
users.sort(
(a, b) => a.age - b.age
);
처음 보면 거의 같은 코드처럼 보인다.
실제로 둘 다:
두 객체를 비교하는 규칙을 전달한다.
는 점에서 매우 비슷하다.
1. Java Comparator
예제
Comparator<User> comparator =
(u1, u2) ->
Integer.compare(
u1.getAge(),
u2.getAge()
);
의미
User 두 개를 받아서
어떤 순서가 앞인지 결정
반환값 규칙
compare(a, b)
음수 → a가 앞
0 → 동일
양수 → b가 앞
예
compare(20, 30)
↓
-1
↓
20이 앞
2. JavaScript sort()
예제
users.sort(
(a, b) => a.age - b.age
);
여기도 사실은
객체 두 개를 받아서
누가 앞인지 결정
한다.
반환 규칙도 거의 동일
(a, b) => ...
음수 → a가 앞
0 → 동일
양수 → b가 앞
예
(20, 30) => -10
↓
20이 앞
3. 놀랍게도 철학은 동일
Java
Comparator<User>
JavaScript
(a, b) => ...
둘 다 사실상
비교 함수(Comparison Function)
를 넘기는 구조.
4. Java 관점
users.sort(comparator);
실제로는
List.sort(
Comparator<? super E> c
)
호출.
내부 정렬 알고리즘이
c.compare(a, b)
를 계속 호출.
예
20 vs 30
↓
compare()
10 vs 20
↓
compare()
30 vs 10
↓
compare()
반복.
5. JavaScript 관점
users.sort(
(a, b) => a.age - b.age
);
내부 정렬 알고리즘이
(a, b)
함수를 계속 호출.
예
20 vs 30
↓
-10
30 vs 10
↓
20
15 vs 30
↓
-15
계속 비교.
6. Java는 객체가 필요
Comparator는 인터페이스.
예전 방식
users.sort(
new Comparator<User>() {
@Override
public int compare(
User u1,
User u2
) {
return Integer.compare(
u1.getAge(),
u2.getAge()
);
}
}
);
실제로는
Comparator 구현 객체
를 전달.
7. JavaScript는 함수 자체 전달
users.sort(
(a, b) => a.age - b.age
);
함수 자체가 객체라서
별도 인터페이스 필요 없음.
이게 가장 큰 차이.
8. Java 람다와 더 비슷
Java 8 이후
users.sort(
(u1, u2) ->
Integer.compare(
u1.getAge(),
u2.getAge()
)
);
이제 거의
users.sort(
(a, b) => a.age - b.age
);
랑 동일한 느낌.
9. comparingInt는 뭘까?
너가 최근 물어본 코드.
users.sort(
Comparator.comparingInt(
User::getAge
)
);
사실 내부적으로는
대략
(u1, u2) ->
Integer.compare(
u1.getAge(),
u2.getAge()
)
생성.
즉
Comparator<User>
객체를 만들어서 반환.
10. JavaScript로 치면
대략 이런 느낌
const comparator =
(a, b) => a.age - b.age;
users.sort(comparator);
매우 유사.
11. thenComparing은?
Java
users.sort(
Comparator.comparingInt(
User::getAge
)
.thenComparing(
User::getName
)
);
의미
1차 정렬
나이
↓
같으면
↓
2차 정렬
이름
JavaScript
users.sort((a, b) => {
if (a.age !== b.age) {
return a.age - b.age;
}
return a.name.localeCompare(
b.name
);
});
동일한 개념.
12. 실무 개발자의 머릿속
Java
Comparator<User>
를 보면
사실상
User 두 개를 받아서
정렬 순서를 결정하는 함수
라고 생각하면 된다.
Comparator<User> 객체가
JavaScript sort 비교 함수처럼
정렬 규칙을 담고 있다.
핵심 한 줄
Java의 Comparator는 "두 객체를 비교하는 규칙을 담은 객체"이고, JavaScript의 sort((a,b)=>...)는 "두 객체를 비교하는 함수"이다. 구현 방식은 다르지만 정렬 알고리즘에 비교 규칙을 전달한다는 개념은 사실상 동일하다.
이걸 이해하면
Comparator.comparing()
Comparator.comparingInt()
thenComparing()
reversed()
가 전부 JavaScript의 정렬 콜백을 객체화한 것처럼 보이기 시작한다. 이 시점부터 Comparator가 훨씬 직관적으로 느껴질 것이다.
반응형
'language > java' 카테고리의 다른 글
| Factory Method Pattern (팩토리 메서드 패턴) (0) | 2026.06.01 |
|---|---|
| Static Factory Method (정적 팩토리 메서드) (0) | 2026.06.01 |
| Virtual Thread (Java 21) 완벽 이해하기 (0) | 2026.06.01 |
| 병렬 Stream(parallelStream) 주의점 완벽 이해하기 (0) | 2026.06.01 |
| ConcurrentHashMap 동시성 처리 완벽 이해하기 (0) | 2026.06.01 |
댓글