z2soo's Blog

JAVA의 Class (10) Comparable 인터페이스 compareTo 메소드 본문

Programming/JAVA

JAVA의 Class (10) Comparable 인터페이스 compareTo 메소드

z2soo 2023. 3. 24. 09:51
반응형

Key point

1. Comparable : 기본 정렬을 위한 인터페이스
2. compareTo : Comparable 내부의 메소드로 정렬 기준을 구현하여 활용
   (-1) 보다 작음
   (0) 동일함
   (+1) 보다 큼
3. java.util.Collections 클래스의 sort() 메소드 사용을 위해서는 Comparable 인터페이스 구현과 compareTo 메서드 오버라이딩 구현 필요!!

 

1. Comparable 인터페이스

Oracle의 공식 문서에 따르면 ... 

해당 인터페이스는 이를 포함(implement)하는 클래스의 각 객체의 전체 순서를 정합니다. 이 순서를 자연 순서(natural ordering)이라 하고, 클래스의 compareTo 메소드는 자연 비교 방법(natural comparison method)라고 합니다. 

 

This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method. (출처 Oracle 공식 문서)

 

 

Comparable (Java SE 11 & JDK 11 )

 

docs.oracle.com

 

2. compareTo 메소드

Oracle의 공식 문서에 따르면 ... 
해당 메소드는 객체를 특정 객체와 비교하여 순서를 정합니다. 반환값으로 음수(-1), 제로(0), 양수(+1)을 각 특정 객체 값보다 작을 때, 동일할 때, 클 때 반환합니다. 
Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object. (출처 Oracle 공식 문서)
 

3. JAVA Code 예제

Student 클래스 

Studnet 객체에 대한 클래스에 comparable 인터페이스를 어떻게 추가하는지 상단 코드를 통해 확인한다. comparable 인터페이스와의 관계를 추가한 후 compareTo 메소드를 추가해 정렬하는 부분을 구현한다..

package SortPack;
					// 다른 클래스와 관계를 맺어줌
					// Comparable은 Collections 소속 인터페이스
public class Student implements Comparable<Student>{
	
	// Collections 클래스로 무언가를 정렬할 때는 그 리스트의 객체들의 정렬기준 결정 필수
	// 정렬의 대상이 되는 객체들의 원본 클래스에서 결정해줌
	
	// compareTo 라는 메소드는 반드시 숫자 4가지를 리턴해야 한다. 
	// 왼쪽이 더 크면 -, 오른쪽이 더 크면 + , 같으면 0
	public int compareTo(Student tmp) {
		//this 는 나, 비교대상은 새로 들어오는 tmp
		if(this.scoreAvg > tmp.scoreAvg) {return 1;}
		else if(this.scoreAvg < tmp.scoreAvg) {return -1;}
		else {return 0;}		
	}
	
	// 1. 생성자
	public Student() {
		studentName = "unKown";
		scoreEng = 0;
		scoreKor = 0;
		scoreMath = 0;
		scoreAvg = 0;
		scoreTot = 0;		
	}
	
	// 2. 속성
	private String studentName;
	private int scoreEng;
	private int scoreKor;
	private int scoreMath;
	private float scoreAvg;
	private float scoreTot;		
	
	// 2.Setter
	void setName(String name) {studentName=name;}
	void setEng(int eng) {scoreEng=eng;}
	void setKor(int kor) {scoreKor=kor;}
	void setMath(int math) {scoreMath=math;}
	void setAvg(float avg) {scoreAvg=avg;}
	void setTot(float total) {scoreTot=total;}
	
	// 3. Getter
	String getName() {return studentName;}
	int getKor() {return scoreKor;}
	int getEng() {return scoreEng;}
	int getMath() {return scoreMath;}
	float getAvg() {return scoreAvg;}
	float getTot() {return scoreTot;}
	
	// 4. Putter
	void putName() {System.out.println("이름: "+studentName);}
	void putEng() {System.out.println("영어성적: "+scoreEng);}
	void putKor() {System.out.println("국어성적: "+scoreKor);}
	void putMath() {System.out.println("수학성적: "+scoreMath);}
	// 실수는 소수점 3자리까지만 출력하도록 함
	void putTot() {System.out.printf("성적총합: %.3f\n", scoreTot);}
	void putAvg() {System.out.printf("성적평균: %.3f\n", scoreAvg);}
	void putInfo() {
		putName();
		putEng();
		putKor();
		putMath();
		putTot();
		putAvg();
	}
	
	// 5. 기타
	boolean processTotal() {
		if ( getEng() < 0 || getKor() < 0 || getMath() < 0 ){
			return false;
		} else {
			setTot(scoreEng+scoreKor+scoreMath);
			return true;
		}
	}
	
	boolean processAvg() {
		if ( getEng() < 0 || getKor() < 0 || getMath() < 0 ) {
			return false;
		} else {
			processTotal();
			setAvg(scoreTot/3.0f);
			return true;
		}
	}		
}

 

SortPlay

SortPlay에서 학생 객체 3개를 생성하고 학생의 점수 평균 값으로 sort 해보도록 하자. 

package SortPack;
import java.util.ArrayList;
import java.util.Collections;

public class SortPlay {
	public static void main(String[] args) {
	
	ArrayList<Student> students = new ArrayList<Student>();
	
	Student x = new	Student();
	Student y = new	Student();
	Student z = new	Student();
	
	x.setName("김씨");
	x.setEng(100);
	x.setKor(80);
	x.setMath(45);
	x.processTotal();
	x.processAvg();
	
	y.setName("박씨");
	y.setEng(90);
	y.setKor(74);
	y.setMath(99);
	y.processTotal();
	y.processAvg();

	z.setName("한씨");
	z.setEng(66);
	z.setKor(79);
	z.setMath(100);
	z.processTotal();
	z.processAvg();
	
	students.add(x); students.add(y); students.add(z);
	// 1. 정렬하기 전 (김>박>한)
	for (Student s : students) {
		s.putInfo();		
	}
	
	// 2. 정렬 후 (박>한>김)
	Collections.sort(students);
	for (Student s : students) {
		s.putInfo();		
	}			
	}
}

 

정렬 전에는 아래와 같이 출력이 되었으나

 

정렬 후에는 아래와 같이 출력된다. 

반응형

'Programming > JAVA' 카테고리의 다른 글

JAVA의 Class (9) 추상 클래스  (0) 2023.01.18
JAVA의 Class (8) Instanceof 연산자  (0) 2023.01.13
JAVA Class (연습) ATM 구현  (0) 2023.01.12
JAVA 멀티스레드 (연습)  (0) 2023.01.11
JAVA 멀티스레드  (0) 2023.01.11
Comments