Java/연습문제

자바 연습문제 - TreeSet과 Comparable을 이용한 자동 정렬 구현

코딩하는냥이 2025. 5. 22. 15:44
반응형

📖 문제

TreeSet에 Student 객체를 저장할 때, score 필드값을 기준으로 자동 정렬되도록 구현하고 싶습니다.
TreeSet의 last() 메소드를 호출했을 때 가장 높은 점수의 Student 객체가 리턴되도록 Student 클래스의
밑줄 친 부분빈 공간에 알맞은 코드를 작성해보세요.


📦 예제 클래스

Student.java

public class Student /*밑줄 쳐진 곳*/ { 
	public String id;
	public int score;

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

	// 빈공간
}

TreeSetExample.java

import java.util.TreeSet;

public class TreeSetExample {
	public static void main(String[] args) {
		TreeSet<Student> treeSet = new TreeSet<Student>();
		treeSet.add(new Student("blue", 96));
		treeSet.add(new Student("hong", 86));
		treeSet.add(new Student("white", 92));
		
		Student student = treeSet.last();
		System.out.println("최고 점수 : " + student.score);
		System.out.println("최고 점수를 받은 아이디 : " + student.id);
	}
}

📌 예제 정답 (Student.java)

public class Student implements Comparable<Student> {
	public String id;
	public int score;

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

	@Override
	public int compareTo(Student o) {
		if (this.score > o.score)
			return 1;
		else if (this.score == o.score)
			return 0;
		else
			return -1;
	}
}

💻 실행 결과

최고 점수 : 96
최고 점수를 받은 아이디 : blue

💬 코드 설명

  • TreeSet은 Comparable 또는 Comparator를 기반으로 요소를 자동 정렬합니다.
  • Student 클래스에 Comparable<Student> 인터페이스를 구현하여 기본 정렬 기준을 제공합니다.
  • compareTo() 메소드에서 score 값을 기준으로 비교하여 정렬이 이루어지게 됩니다.
    • 점수가 클수록 더 나중에 정렬되어 last() 호출 시 가장 높은 점수가 선택됩니다.

💡 학습 포인트

  1. TreeSet의 정렬 기준 이해하기
    TreeSet은 요소를 저장할 때 정렬 기준이 반드시 있어야 하며, Comparable을 통해 기본 비교 기준을 설정할 수 있습니다.
  2. Comparable 인터페이스 구현하기
    사용자 정의 객체를 정렬 가능한 상태로 만들기 위해 compareTo() 메소드를 구현해야 합니다.
  3. 오름차순 vs 내림차순
    • 위 예제에서는 score가 높을수록 나중에 정렬되도록 하여 last()를 호출하면 최고 점수를 가진 객체가 반환됩니다.
    • 정렬 방향을 바꾸고 싶다면 compareTo()의 리턴 값을 반대로 조정하면 됩니다.
  4. TreeSet은 중복을 허용하지 않음
    compareTo() 결과가 0이면 동일 객체로 간주되어 중복 저장이 되지 않습니다.

📌 마무리 정리

  • 이 문제는 TreeSet을 사용할 때 정렬 기준을 명확히 지정해야 한다는 점을 이해하기 위한 연습 문제입니다.
  • Comparable 구현을 통해 Student 객체가 정렬 가능한 구조가 되었으며, last() 호출 시 자동으로 최고 점수 객체가 선택됩니다.
  • 실무에서는 랭킹 시스템, 우선순위 처리, 정렬 기준 정의 등에 자주 사용되는 패턴입니다.