[JAVA] Comparable๊ณผ Comparator

Updated:

Categories:

Tags: ,

๐Ÿ“Œ ๊ฐœ์ธ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๊ณต๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ณต์Šตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค :๐Ÿ˜ธ
[ํ‹€๋ฆฐ ๋‚ด์šฉ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ณต๋ฐ›์œผ์‹ค๊ฑฐ์—์š”]

Java์˜ Comparable๊ณผ Comparator

์ด๋ฒˆ์— ์ฝ”๋“œํŠธ๋ฆฌ๋กœ DP(๋™์  ๊ณ„ํš๋ฒ•)๋ฅผ ๊ณต๋ถ€ํ•˜๋ ค๊ณ  ๊ฒฐ์ œํ–ˆ๋Š”๋ฐ, ๊ฐ์ฒด ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋‚˜์™”๋‹ค. ํ‰์†Œ ๊นŠ๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋˜ Comparable๊ณผ Comparator์— ๋Œ€ํ•ด ๋‹ค๋ค„์•ผ ํ–ˆ๊ณ , ์ด์ฐธ์— ์ž๋ฐ”์˜ ์ •์„์„ ๋‹ค์‹œ ๋ณด๋ฉฐ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค. ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ž๋ฐ”์—์„œ ๊ฐ์ฒด ์ •๋ ฌ์„ ์ง€์›ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ตฌ์„ฑ์š”์†Œ๋กœ, ์ •๋ ฌ ๊ธฐ์ค€์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹์ด ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค.

Java์˜ Arrays.sort()๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Comparable ๋˜๋Š” Comparator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ •๋ ฌํ•œ๋‹ค.

์ด ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ •๋ ฌ ๊ธฐ์ค€์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

Comparable

1
2
3
public interface Comparable<T> {
    public int compareTo(T o);
}
  • Comparable ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค ๋‚ด๋ถ€์— โ€œ๊ธฐ๋ณธ ์ •๋ ฌ ๊ธฐ์ค€โ€์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ฐ™์€ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ผ๋ฆฌ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ์ค€๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ(์ž‘์€ ๊ฐ’ โ†’ ํฐ ๊ฐ’)์œผ๋กœ ์ •๋ ฌ๋˜๋„๋ก ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.
  • Java์˜ Integer, String, Date์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋Š” ๋ชจ๋‘ Comparable์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.
  • compareTo() ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ฐ’
    • ์Œ์ˆ˜: ํ˜„์žฌ ๊ฐ์ฒด(this)๊ฐ€ ๋น„๊ต ๋Œ€์ƒ๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ.
    • 0: ํ˜„์žฌ ๊ฐ์ฒด์™€ ๋น„๊ต ๋Œ€์ƒ์ด ๊ฐ™์„ ๊ฒฝ์šฐ.
    • ์–‘์ˆ˜: ํ˜„์žฌ ๊ฐ์ฒด๊ฐ€ ๋น„๊ต ๋Œ€์ƒ๋ณด๋‹ค ํด ๊ฒฝ์šฐ.

์˜ˆ์ œ : ๊ธฐ๋ณธ ์ •๋ ฌ ๊ธฐ์ค€ ์ •์˜

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Student implements Comparable<Student> {
    String name;
    int score;

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    @Override
    public int compareTo(Student other) {
        return this.score - other.score; // ์ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    }
}

// ์‚ฌ์šฉ
Student[] students = {
    new Student("Alice", 85),
    new Student("Bob", 90),
    new Student("Charlie", 80)
};

Arrays.sort(students);

Comparator

1
2
3
4
public interface Comparator<T> {
    int compare(T o1, T o2);
    boolean equals(Object obj);
}
  • Comparator ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ โ€œ์ •๋ ฌ ๊ธฐ์ค€โ€์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • Comparable๊ณผ ๋‹ฌ๋ฆฌ, ํ•œ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ์ •๋ ฌ ๊ธฐ์ค€์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•™์ƒ์˜ ์ด๋ฆ„, ์ ์ˆ˜, ๋‚˜์ด ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ ํ•ฉํ•˜๋‹ค.\
  • compare() ๋ฉ”์„œ๋“œ ๋ฐ˜ํ™˜๊ฐ’
    • ์Œ์ˆ˜: ์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด(o1)๊ฐ€ ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด(o2)๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ.
    • 0: ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ.
    • ์–‘์ˆ˜: ์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด(o1)๊ฐ€ ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด(o2)๋ณด๋‹ค ํด ๊ฒฝ์šฐ.

์˜ˆ์ œ: ์—ฌ๋Ÿฌ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class NameComparator implements Comparator<Student> {
    @Override
    public int compare(Student s1, Student s2) {
        return s1.name.compareTo(s2.name); // ์ด๋ฆ„ ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    }
}

class ScoreComparator implements Comparator<Student> {
    @Override
    public int compare(Student s1, Student s2) {
        return s2.score - s1.score; // ์ ์ˆ˜ ๊ธฐ์ค€ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
    }
}

// ์‚ฌ์šฉ
Arrays.sort(students, new NameComparator()); // ์ด๋ฆ„ ๊ธฐ์ค€ ์ •๋ ฌ
Arrays.sort(students, new ScoreComparator()); // ์ ์ˆ˜ ๊ธฐ์ค€ ์ •๋ ฌ

Comparable vs Comparator ๋น„๊ต

ํŠน์ง• Comparable Comparator
์—ญํ•  ํด๋ž˜์Šค ๋‚ด๋ถ€์— โ€œ๊ธฐ๋ณธ ์ •๋ ฌ ๊ธฐ์ค€โ€ ์ •์˜ ์™ธ๋ถ€์—์„œ ๋‹ค์–‘ํ•œ ์ •๋ ฌ ๊ธฐ์ค€ ์ •์˜
๋ฉ”์„œ๋“œ compareTo(T o) compare(T o1, T o2)
์‚ฌ์šฉ ์œ„์น˜ ์ •๋ ฌ ๋Œ€์ƒ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ ๊ตฌํ˜„ ํด๋ž˜์Šค ์™ธ๋ถ€์—์„œ ๋ณ„๋„๋กœ ์ •์˜
์ •๋ ฌ ๊ธฐ์ค€ ์ˆ˜ ํ•œ ๊ฐ€์ง€ ์ •๋ ฌ ๊ธฐ์ค€ ์—ฌ๋Ÿฌ ์ •๋ ฌ ๊ธฐ์ค€
์‚ฌ์šฉ ์˜ˆ Arrays.sort(arr) Arrays.sort(arr, comparator)
๊ธฐ์กด ํด๋ž˜์Šค ์ˆ˜์ • ํ•„์š” ์—ฌ๋ถ€ ํ•„์š” (์ •๋ ฌ ๊ธฐ์ค€ ๋ณ€๊ฒฝ ์‹œ ํด๋ž˜์Šค ์ˆ˜์ •) ๋ถˆํ•„์š” (ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ์ •๋ ฌ ๊ธฐ์ค€ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ)

๋ฌธ์ž์—ด ์ •๋ ฌ ์˜ˆ์ œ

์ž๋ฐ”์˜ ์ •์„ ์˜ˆ์ œ 11-19

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
import java.util.*;

class ComparatorEx {
    public static void main(String[] args) {
        String[] strArr = {"cat", "Dog", "lion", "tiger"};

        // ๊ธฐ๋ณธ ์ •๋ ฌ (Comparable ์‚ฌ์šฉ)
        Arrays.sort(strArr);
        System.out.println("Default Sort: " + Arrays.toString(strArr));

        // ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†๋Š” ์ •๋ ฌ
        Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
        System.out.println("Case-Insensitive Sort: " + Arrays.toString(strArr));

        // ์—ญ์ˆœ ์ •๋ ฌ (Comparator ์‚ฌ์šฉ)
        Arrays.sort(strArr, new DescendingOrder());
        System.out.println("Descending Sort: " + Arrays.toString(strArr));
    }
}

class DescendingOrder implements Comparator<String> {
    @Override
    public int compare(String s1, String s2) {
        return s2.compareTo(s1); // ์—ญ์ˆœ ์ •๋ ฌ
    }
}

๋ฌธ์ œ ํ’€๋ฉด์„œ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„

Q. Arrays.sort(arr, fromIndex, toIndex)

  • fromIndex: ์ •๋ ฌ์„ ์‹œ์ž‘ํ•  ์ธ๋ฑ์Šค.
  • toIndex: ์ •๋ ฌ์„ ๋ฉˆ์ถœ ์ธ๋ฑ์Šค ๋ฐ”๋กœ ๋‹ค์Œ ์œ„์น˜.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, Arrays.sort(arr, 0, 5)๋Š” ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค 0๋ถ€ํ„ฐ 4๊นŒ์ง€๋ฅผ ์ •๋ ฌํ•œ๋‹ค.

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ค€๋น„ํ•˜๋ฉด์„œ ํ•˜๋‚˜์˜ ํ”Œ๋žซํผ์—๋งŒ ์ต์ˆ™ํ•˜๋‹ค๋ณด๋‹ˆ, ๋น„์Šทํ•œ ์œ ํ˜•์˜ ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ํ’€์—ˆ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ ์ด๋ฒˆ์— ์ฝ”๋“œํŠธ๋ฆฌ๋กœ ๋„˜์–ด์˜ค๋ฉด์„œ ์ž๋ฐ”์— ๋Œ€ํ•ด ๋ถ€์กฑํ–ˆ๋˜ ๋ถ€๋ถ„์„ ์ฑ„์šธ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค. ํ—ˆ์ ์ด ๋งˆ๊ตฌ ๋“œ๋Ÿฌ๋‚˜๋Š”๋“ฏโ€ฆ ๊ทธ๋ž˜๋„ ์ฑ„์›Œ๋‚˜๊ฐ€์•ผ์ง€~ Comparable์ด๋ž‘ Comparator ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด์„œ ๊ตฌํ˜„๋„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค ์ด์ œ !

JAVA-Learn ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด ๋‹ค๋ฅธ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

Leave a comment