본문 바로가기
language/java

번외편 - Java Comparator vs JavaScript sort()

by 죄니안죄니 2026. 6. 4.
반응형

번외편 - 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가 훨씬 직관적으로 느껴질 것이다.

반응형

댓글