ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067) N
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180) N
      • Unreal (69)
      • Unity (100) N
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • c#
  • 그래픽스
  • C
  • 함수
  • 오블완
  • C++
  • 문자열
  • 백준
  • 언리얼
  • 티스토리챌린지
  • Unity
  • 유니티
  • SQL
  • 파이썬
  • string
  • 클래스
  • 배열
  • 프로그래머스
  • 알고리즘
  • 포인터

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

프로그래밍 언어/Java

[Java] Comparable과 Comparator : 비교를 위한 인터페이스

2024. 10. 22. 22:48

Comparable 인터페이스

Comparable은 자기 자신과 매개변수 객체를 비교할 수 있도록 만들어주는 인터페이스이다. 이 인터페이스를 채택하여 구현하면 compareTo 메서드를 통하여 객체간에 비교가 가능해진다.

Comparable 인터페이스와 Comparator 인터페이스

Comparable과 비슷한 기능을 하는 인터페이스로 Comparator가 있다. 둘의 차이점은 다음과 같다.

1) 구현해야 하는 메서드의 차이

Comparable은 compareTo(T o1)을 구현해야 한다.

Comparator는 compare(T o1, T 02)를 구현해야 한다. 매개변수가 2개이다.

 

2) 사용 방법의 차이

Comparable은 자기 자신과 다른 객체를 비교한다.

Comparator는 매개변수로 들어오는 두 객체를 비교한다.

 

3) package

Comparable은 lang 패키지에 존재하기에, import를 하지않아도 된다.

Comparator은 util 패키지에 있기에 따로 import를 해줘야 한다.

Comparable

Comparable은 아래와 같이 정의되어 있고, comparTo(T o) 메서드를 구현해주면 된다.

public interface Comparable<T> {
   public int compareTo(T o);
}

기본적으로 비교할 수 없는 타입을 비교할 수 있도록 만들어주는 것이고, 출력값으로 int가 나오기 때문에 T 자리에 비교하고자 하는 타입을 넣은 다음, 각 타입이 가진 멤버 변수들을 이용해 비교해주면 된다.

 

일반적인 구현 예시

class Person implements Comparable<Person> {
 
	private int age;			// 나이
	
	Person(int age) {
		this.age = age;
	}
	
	@Override
	public int compareTo(Person o) {
		if(this.age > o.age) {
			return 1;
		} else if(this.age == o.age) {
			return 0;
		}	else {
			return -1;
		}
	}
}

위와 같이 클래스가 가진 age 프로퍼티를 비교에 사용해줄 수 있다.

@Override	
public int compareTo(Person o) {
	return (this.age - o.age)
}

또는 이런 식의 방법도 가능하다. 어찌됐건 의도에 따라 양수, 0, 음수가 반환되기 때문이다. 이러한 방식을 사용할 때에는, Overflow와 Underflow만 조심해주면 된다

 

Node<String>을 상속한 Genre의 비교

class Genre extends Node<String> implements Comparable<Genre> {

	public Genre(String name) {
		super(name);
	}
	
	@Override
	public int compareTo(Genre o) {
		return super.getItem().compareTo(o.getItem());
		// 스스로가 크면 1 같으면 0 작으면 -1
	}
}

SuperClass인 Node의 getItem()은 Node가 가진 item을 반환하는 메서드로, String 이기에 String에 구현된 compareTo 메서드를 사용할 수 있다. 따라서 위와 같이 구현하는 것이 가능했다.

Comparator

class Person implements Comparator<Person> {
 
	private int age;			// 나이
	
	Person(int age) {
		this.age = age;
	}
	
	@Override
	public int compare(Person o1, Person o2) {
		return (o1.age - o2.age)
	}
}

앞서 Comparator의 compare은 매개변수로 온 두 객체를 비교한다고 했는데, 여기서 메서드의 호출은 a.compare(b, c) 와 같은 형식이 될 것이다. 따라서 메서드를 호출하는 주체는 결과에 영향을 주지 않는다는 것을 알 수 있다.

 

Comparator를 공부하면서, 보통의 경우 Comparable이 더 편리하겠다는 생각을 했다. 비교에 있어서 메서드 호출의 주체가 매번 변할 수 있는 Comparator은 일관성이 떨어지기 때문이다. 그러나 이러한 문제를 해결하기 위해 익명 객체를 이용할 수 있다고 한다.

 

https://jazz-the-it.tistory.com/20

저작자표시 (새창열림)

'프로그래밍 언어 > Java' 카테고리의 다른 글

[Java] Collection Framework (자료구조 종류)  (0) 2025.02.09
[Java] switch문  (0) 2025.02.02
[Java] Collections 클래스  (0) 2024.10.22
[Java] Generic 제네릭  (0) 2024.10.22
[Java] BigDecimal  (1) 2024.09.04
    '프로그래밍 언어/Java' 카테고리의 다른 글
    • [Java] Collection Framework (자료구조 종류)
    • [Java] switch문
    • [Java] Collections 클래스
    • [Java] Generic 제네릭
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바