IT_Programming/Java

Comparable 인터페이스

JJun ™ 2007. 7. 5. 21:47
LONG

==========================[GradeComparableMain.java]========================

import java.util.*;
public class GradeComparableMain {
 public static void main(String[] args) {
  Grade[] g= new Grade[7];
  g[0] = new Grade(60,60,70);
  g[1] = new Grade(89,65,67);
  g[2] = new Grade(60,80,100);
  g[3] = new Grade(70,99,80);
  g[4] = new Grade(60,70,80);
  g[5] = new Grade(60,80,80);
  g[6] = new Grade(73,70,80);
  Grade [] g2=GradeBubbleSort.bubble(g);
  System.out.println("입력순 출력==============");
  prints(g2);
 }
 public static void prints(Grade[ ] v){
  int num=v.length;
  for(int i=0;i<num;i++){
      System.out.println(v[i]);
    }
//for
    System.out.println();
 }
//prints
}

-------------------------------------------------------------------------------------------

참조 타입은 배열을 정의할 때 초기화되지 않는다. 그러므로 객체를 생성할 때 반드시 초기화해야 한다.

static 타입이면서 Grade 타입 배열을 버블정렬 하는 bubble() 메서드를 호출한다.

bubble을 void로 선언했다면 GradeBubbleSort.bubble(g);로 바꾸어 prints(g)로 출력하면 된다.
===========================================================================================

ARTICLE

Comparable의 compareTo(Object obj) 메서드는 객체의 순서를 정렬하는 방법이다.

Comparable을 구현한다면 compareTo(Object obj)를 구현해야 한다.

 

/* 학생 성적 비교하기 예제 */

================================[Grade.java]==================================

public class Grade implements Comparable{
 private double kor;
 private double eng;
 private double math;
 private double total;
 private double mean;
 public Grade(){  this(0,0,0);  } // ↓에 의해 객체 생성시 초기화 
 public Grade(double kor,double eng,double math){
  this.kor=kor;     this.eng=eng;        this.math=math;
  getMean();
 }
 public String toString (){
  return (kor+"/"+eng+"/"+math+"/"+total+"/"+mean);
 }
 public double getEng() {   return eng;   }
 public double getKor() {   return kor;   }
 public double getMath(){   return math;  }
 public double getMean() {
  mean=getTotal()/3.0;
  return mean;
 }
 public double getTotal() {
  total=(this.kor+this.eng+this.math);
  return total;
 }
 public void setEng(double d) {  eng = d;   getMean();}
 public void setKor(double d) {  kor = d;   getMean();}
 public void setMath(double d){  math = d;  getMean();}
 
//Comparable의 구현해야 할 메서드
 public int compareTo(Object o1){
  Grade g2=(Grade)o1;
  double mean1=this.mean; // g1 안에서 평균값은 this.mean이다.
  double mean2=g2.getMean();

  // g1 안에서 평균값과 g2의 평균을 비교하려고 g2.getMean()으로 g2의 평균값을 구한다.
  if(mean1>mean2){
   return -1; 
//decreasing
  }else if(mean1==mean2){
   return 0;
  }else {
   return 1; 
//increasing
  }
 }
}

-----------------------------------------------------------------------------------------

두 성적(Grade)의 높고 낮음을 판단하려고 Comparable 인터페이스의 compareTo 메서드를 사용한다.

g1.compareTo(g2)를 써서 두 점수를 비교한다. g1.compareTo(g2)는 g1 안에서 g2를 비교한다.

Grade 타입인 g1안에서 외부에 있는 g2를 비교하므로 g1의 멤버를 사용할 수 있고,

g2는 getMean 메서드를 사용한다. 성적을 비교하려고 Grade로 캐스팅한다.

===========================================================================================

 

============================[GradeBubbleSort.java]============================

/* 거품 정렬 */

public class  GradeBubbleSort
{
 public  static Grade[ ] bubble(Grade [] a){
  int n=a.length;
  for(int i=0;i<n-1;i++){
   for(int j=0;j<n-1-i;j++){
    if(a[j].compareTo(a[j+1])>0){ 
     Grade temp=a[j+1]; 
//스왑
     a[j+1]=a[j];
     a[j]=temp;
    }
   }
  }
  return a;
 }
}

==============================================================================