Java/Java의 이해

자바 기본 문법 정리 (interface : Comparable과 Comparator)

startfront 2025. 2. 11. 18:15

오늘은 interface Comparable과 Comparator에 대한 활용 법과 정의에 대하여 알아보겠습니다!!

 

두 인터페이스를 통하여 객체를 정렬할 수 있답니다!!

이를 통하여 객체를 비교할 수 있게 하여 다양한 활용이 가능합니다.

 

primitive 타입의 실수 변수(byte, int, double 등등..)의 경우 부등호를 갖고 쉽게 두 변수를 비교 할 수 있지만

객체의 경우 따로 용자가 기준을 정해주지 않는 이상 어떤 객체가 더 높은 우선순위를 갖는지 판단이 어렵습니다.

 

이러한 문제점을 해결하는 것이 바로 Comparable 또는 Comparator라고 합니다.

 

1. Comparable

: 자기 자신과 매개변수 객체를 비교

✅ Arrays.sort (객체배열), Collections.sort(Collection)
함수를 통해 정렬할 때 어떤 기준으로 정렬할지 compareTo()로 지정하기 위한 interface
정렬하려는 객체의 클래스에서 Comparable를 상속받는다..
* ex) Employee 객체들을 정렬하기 위해서는 Employee 클래스에 Comparable 선언한다.

 

*  compareTo 메소드

class Student implements Comparable<Student> {
 
	int age;			
	int classNumber;	
	
	Student(int age, int classNumber) {
		this.age = age;
		this.classNumber = classNumber;
	}
	
	@Override
	public int compareTo(Student o) {
    	}
   }

- 자기자신과 매개변수와의 차이를 통하여 오름차순 , 내림차순을 결정

 

  • 오름 차순 정렬

-비교할 값이 비교 대상 보다 크면 양수, 같으면 0, 작으면 음수를 리턴한다.

- 현재 객체 - 인자로 전달된 객체   

**주의!!!! 오름 차수 정렬 syudent가 음수 일때는 오버 플로우 발생 

  • 내림 차순 정렬

- 비교할 값이 비교 대상 보다 크면 음수, 같으면 0, 작으면 양수를 리턴한다.

인자로 전달된 객체 - 현재 객체

 // 오름차순     
public int compareTo(Student o) {
    
		if(this.age > o.age) {
			return 1;
		}
		else if(this.age == o.age) {
			return 0;
		}
		else {
			return -1;
            
        
 //return age - o.age;
 //return Integer.compare(age, o.age); 
 
 //내림차순
		//if(age> o.age)return -1 ;
		//else if (age == o.age)return 0;
		//else return 1;
		
		//return o.age - age; 
		//return Integer.compare(o.age, age);

 

 

2. Comparator

: 자기 자신과 매개변수를 비교 , compareTo 메소드 반드시 구현

✅ Arrays.sort(객체배열, Comparator), Collections.sort(Collection, Comparator)
함수를 통해 정렬할 때 어떤 기준으로 정렬할지 compare()로 지정하기 위한 interface

- sort() 함수의 두번째 인자로 Comparator를 전달한다.
public class ComparableTest {
	public static void main(String[] args) {
		Employee[] emps = { 
				new Employee("1", "1", 5),
				new Employee("1", "1", 1),
				new Employee("1", "1", 2),	
		};
		
		
		 // 기본타입을 내림 차순으로 정렬
		 // comparator를 두번째 인자로 전달해야 한다
		 // =>comparator의 compare 함수는 객체만 전달 받는다.
		 // =>Wrapper를 이용해ㅇ야 한다.*/
		
		Integer[]array2 = {5,2,4,1,7};
		Arrays.sort(array2,new Comparator<Integer>() {
			
			public int compare(Integer o1, Integer o2) {
				//내림 차순
				return o2-21;
			}

 

3. 람다

 () ->{ } 
 () : 인자가 없거나 두개 이상일때 반드시 소괄호로 인자를 표시한다.
 { } : 문장이 2문장 이상일 때 사용한다.
public class ComparableTest2 {
	public static void main(String[] args) {
		Employee[] emps = { 
				new Employee("2", "1", 5),
				new Employee("1", "1", 1),
				new Employee("3", "1", 2),	
		};
		
		//내림 차순 정리
		Integer[] array2 = {5, 1, 7, 2};
		Arrays.sort(array2, (a, b) -> { return b-a;});
		System.out.println(Arrays.toString(array2));
		
		Arrays.sort(emps, (a, b) -> { return b.getEmpno().compareTo(a.getEmpno());});
		System.out.println(Arrays.toString(emps));

 

 

* 정렬의 방식은 comparable comparator 람다 형식 중 원하는 형식 사용!!!!

 

4. Wrapper : 자바의 기본타입(Primitive)을 객체로 사용할 수 있도록 제공하는 클래스

* byte => Byte
* short => Short
* char => Character
* int => Integer
* long => Long
* float => Float
* double => Double
* boolean => Boolean
  • parseXXX(String)

인자로 전달된 문자열을 해당 Wrapper의 Format으로 변경하는 함수

* 주의점 format 이 맞지 않는 경우 NumberFormatException 발생

 

 ex) Integer.parseInt("3.14") Integer.parseInt("a")

 

 

  • Character의 isXXXX('')

인자로 전달된 문자가 해당 타입인지 검사하는 함수

ex) Character.isDigit('1')