[ java ] Comparator, Comparable 차이

2024. 12. 3. 16:30·JAVA

📌 Comparator, Comparable 사용이유

primitive 타입(int, double 등)의 실수 변수는 부등호를 통해 두 변수를 비교할 수 있다.

→ 기본 자료형이기 때문에 부등호로 쉽게 비교가 가능하다.

 

❓ 그렇다면 새로운 클래스 객체는 어떻게 비교할까

→ comparator, comparable를 사용하여 객체를 비교한다.

 

Comparable과 Comparator는 모두 인터페이스(interface)이다
즉, Comparable 혹은 Comparator의 사용을 위해서는 인터페이스 내에 선언된 메소드를 반드시 구현해야한다.

 

[ comparable 특징 ]

  • 자기 자신과 매개변수를 비교한다.
  • Comparable은 lang패키지에 있기 때문에 import 를 해줄 필요가 없다.

[ comparator 특징 ]

  • 파라미터로 들어오는 두 객체를 비교한다.
  • Comparator는 util패키지에 있기 때문에 import 해주어야 한다.

 

📌 Comparable

  • Comparable 인터페이스에는 compareTo(T o) 메소드 하나가 선언되어있는 것을 볼 수 있다.
  • 이 말은 우리가 만약 Comparable을 사용하고자 한다면 compareTo 메소드를 **재정의(Override/구현)**을 해주어야 한다는 것이다.
  • comparable은 자기 자신과 객체 매개변수 객체를 비교한다.

값을 비교하는 방법

  • 자기 자신을 기준으로 들어온 매개변수를 비교한다
    • 즉 자기 자기자신을 기준으로 삼아 대소관계를 파악한다.
    3
5   5
    6
  • 나 자신이 5라고 할때
    • 들어온 매개변수가 3인 경우 : 나 자신은 2가 더 크다 (+2 : 양수)
    • 들어온 매개변수가 5인 경우 : 나자신과 같다 (0)
    • 들어온 매개변수가 6인 경우 : 나 자신은 1이 더 작다. ( -1 : 음수 )

 

📌 Comparable 참고코드

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) {
    
		// 자기자신의 age가 o의 age보다 크다면 양수
		if(this.age > o.age) {
			return 1;
		}
		// 자기 자신의 age와 o의 age가 같다면 0
		else if(this.age == o.age) {
			return 0;
		}
		// 자기 자신의 age가 o의 age보다 작다면 음수
		else {
			return -1;
		}
	}
}

 

 

📘 compareTo의 return 방식을 아래와 같이 사용해서 양수, 음수, 0을 구분할 수 있다.

return this.age - o.age;
  • 위와 같은 방식을 사용하면 뺄셈 과정에서 자료형의 범위를 넘어버리는 경우가 발생할 수 있기 때ansdp overflow가 발생할 수 있다.

 

 

📌 Comparator

  • Comparator 인터페이스에는 선언 된 메소드가 많다.
    • 실질적으로 구현해야하는 것은 compare(T o1, T o2) 다.
  • Comparator는 자기 자신의 상태와는 상관없이 파라미터로 들어오는 두 객체를 비교하는 것이다.

 

📌 Comparator 참고코드

import java.util.Comparator;	// import 필요

class Student implements Comparator<Student> {

int age;			// 나이
int classNumber;	// 학급

Student(int age, int classNumber) {
	this.age = age;
	this.classNumber = classNumber;
}

@Override
public int compare(Student o1, Student o2) {

	// o1의 학급이 o2의 학급보다 크다면 양수
	if(o1.classNumber > o2.classNumber) {
		return 1;
	}
	// o1의 학급이 o2의 학급과 같다면 0
	else if(o1.classNumber == o2.classNumber) {
		return 0;
	}
	// o1의 학급이 o2의 학급보다 작다면 음수
	else {
		return -1;
	}
}

}

 

 

 

📌 참고 블로그


https://st-lab.tistory.com/243

 

자바 [JAVA] - Comparable 과 Comparator의 이해

아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객

st-lab.tistory.com

 

 

 

 

'JAVA' 카테고리의 다른 글

[ java ] 배열 (복사, 비교) , 2차원배열 개념  (0) 2024.12.04
[ java ] String 클래스(문자열 분리, 비교)  (0) 2024.12.04
[ java ] Comparable, Comparator 와 정렬의 관계  (0) 2024.12.03
[ java ] 조건문  (0) 2024.12.03
[ java ] 반복문  (0) 2024.12.03
'JAVA' 카테고리의 다른 글
  • [ java ] 배열 (복사, 비교) , 2차원배열 개념
  • [ java ] String 클래스(문자열 분리, 비교)
  • [ java ] Comparable, Comparator 와 정렬의 관계
  • [ java ] 조건문
Adose
Adose
  • Adose
    도즈의 개발 블로그
    Adose
  • 전체
    오늘
    어제
    • 분류 전체보기 (169)
      • JAVA (22)
      • 스프링 | 스프링 부트 (30)
        • 스프링 시큐리티 (1)
        • 채팅 (1)
      • 스프링 프로젝트 (5)
        • JDBC - 은행앱 구현 (1)
        • Spring Boot - 독서 블로그 프로젝트 (3)
        • 개인 프로젝트 - CoreBrief (1)
      • 가상화 기술 (1)
      • Git (1)
      • 코딩테스트 (36)
        • 프로그래머스 입문 (56)
      • AWS (1)
      • 데이터베이스 (0)
      • CS 공부 (3)
      • 알고리즘, 자료구조 (5)
      • 우테코 프리코스 (7)
      • 트러블 슈팅 (1)
      • 프론트 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    jdbc
    자바
    코딩테스트
    LV2
    LV1
    스프링
    멋쟁이사자처럼
    test
    프로그래머스
    GIT
    스프링부트
    LV0
    Spring
    springdatajdbc
    프론트
    멋쟁이사자처럼백엔드
    Java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Adose
[ java ] Comparator, Comparable 차이
상단으로

티스토리툴바