자바 프로그래밍에서 객체를 비교하는 것은 중요한 작업 중 하나이다. 이를 효과적으로 수행하기 위해 자바에서는 Comparable과 Comparator 인터페이스를 제공한다. 이 두 가지 인터페이스를 사용하여 객체를 비교하는 방법에 대해 알아보자.
Comparable 인터페이스
Java의 Comparable 인터페이스는 객체의 비교를 가능하게 하는 인터페이스이다. 이 인터페이스를 구현한 클래스의 인스턴스들은 자연스러운 순서(숫자의 오름차순 또는 문자열의 사전순)에 따라 비교할 수 있다. 이것은 주로 정렬 알고리즘과 같은 컬렉션 프레임워크에서 객체를 비교하고 정렬하는 데 사용된다.
Comparable 인터페이스는 다음과 같이 정의되어 있다:
public interface Comparable<T> {
int compareTo(T o);
}
이 인터페이스는 compareTo 메서드 하나를 정의하고 있다. 이 메서드는 객체를 다른 객체와 비교하고 정수를 반환한다. 반환 값의 의미는 다음과 같다.
- 0보다 작으면: 현재 객체(this)는 다른 객체(o)보다 작다는 것을 의미한다.
- 0이면: 현재 객체(this)와 다른 객체(o)는 같다는 것을 의미한다.
- 0보다 크면: 현재 객체(this)는 다른 객체(o)보다 크다는 것을 의미한다.
예를 들어, 정수를 비교하는 경우 compareTo 메서드는 두 정수를 비교하고 결과에 따라 음수, 0 또는 양수를 반환한다. 문자열을 비교하는 경우 문자열의 유니코드 순서를 기반으로 비교한다.
Comparable 예제
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student otherStudent) {
return this.age - otherStudent.age;
}
@Override
public String toString() {
return name + " (Age: " + age + ")";
}
}
public class Main {
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student("Alice", 20),
new Student("Bob", 19),
new Student("Charlie", 22)
);
Collections.sort(students);
for (Student student : students) {
System.out.println(student);
}
}
}
Bob (Age: 19)
Alice (Age: 20)
Charlie (Age: 22)
Comparator 인터페이스
Java의 Comparator 인터페이스는 객체를 서로 다른 방식으로 비교하고 정렬하기 위한 인터페이스이다. 이 인터페이스를 구현한 클래스의 인스턴스들은 사용자 정의된 비교 로직에 따라 정렬할 수 있다. Comparator를 사용하면 객체의 기본 정렬 기준 외에도 사용자 정의 정렬을 구현할 수 있다.
Comparator 인터페이스는 다음과 같이 정의되어 있다:
public interface Comparator<T> {
int compare(T o1, T o2);
}
compare 메서드는 두 개의 객체를 인수로 받고, 비교 결과에 따라 정수를 반환한다. 반환 값의 의미는 다음과 같다.
- 0보다 작으면: o1 객체가 o2 객체보다 작다는 것을 의미한다.
- 0이면: o1 객체와 o2 객체는 같다는 것을 의미한다.
- 0보다 크면: o1 객체가 o2 객체보다 크다는 것을 의미한다.
Comparator 예제
public class comparator implements Comparator<Student> {
@Override
public int compare(Student student1, Student student2) {
return student1.getAge() - student2.getAge();
}
}
public class Main {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("Alice", 20));
students.add(new Student("Bob", 19));
students.add(new Student("Charlie", 22));
Collections.sort(students, new AgeComparator());
for (Student student : students) {
System.out.println(student);
}
}
}
Bob (Age: 19)
Alice (Age: 20)
Charlie (Age: 22)
Comparable과 Comparator 활용
Comparable은 클래스 내에서 기본 정렬 기준을 제공하며 간단하고 직관적이지만 수정에 제한이 있다. Comparator는 외부에서 다양한 정렬 기준을 제공하고 유연성이 있지만 코드 작성이 더 필요하고 일관성을 유지해야 한다.
Comparable을 사용해야 하는 경우
- 객체의 기본 정렬 순서를 클래스 내부에서 정의하는 경우
- 클래스가 기본 정렬 기준을 가지는 경우
Comparator를 사용해야 하는 경우:
- 이미 구현된 클래스를 정렬해야 하며, 해당 클래스의 소스 코드를 변경하고 싶지 않는 경우
- 여러 다른 정렬 기준을 지원해야 하는 경우
- 외부 라이브러리나 다른 모듈에서 제공하는 클래스를 정렬해야 하는 경우
- 기본 정렬 기준 외에도 사용자 정의 정렬 기준이 필요한 복잡한 정렬 로직이 있는 경우
'JAVA' 카테고리의 다른 글
[JAVA/자바] Code Convention 코드 컨벤션 (0) | 2024.02.28 |
---|---|
[JAVA/자바] 소수점 출력 (0) | 2024.02.25 |
[JAVA/자바] 실행시간 확인 (0) | 2023.10.03 |
[JAVA/자바] 메모리 사용량 확인 (0) | 2023.10.03 |
[JAVA/자바] 자바 입출력 (0) | 2023.08.10 |