๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java

[Java-๊ธฐ์ดˆ] Comparable ์ธํ„ฐํŽ˜์ด์Šค์™€ Comparator ์ธํ„ฐํŽ˜์ด์Šค

by ์ฝ”๋”ฉํ•˜๋Š” ๋ถ•์–ด 2021. 2. 22.
๋ฐ˜์‘ํ˜•

โ–ถ Comparable ์ธํ„ฐํŽ˜์ด์Šค์™€ Comparator ์ธํ„ฐํŽ˜์ด์Šค

Member ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง„ ํšŒ์› ์•„์ด๋””๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ๊ฒƒ์ธ๋ฐ, Comparable๊ณผ Comparator๋Š” ์ด๋Ÿฌํ•œ ์ •๋ ฌ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

โ€‹

โ€‹

โ€‹

*์ž๊ธฐ ์ž์‹ ๊ณผ ์ „๋‹ฌ๋ฐ›์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋Š” Comparable ์ธํ„ฐํŽ˜์ด์Šค

Comparable ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” compareTo( ) ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

package collection;

public class Member implements Comparable<Member> {
	private int memberID;
	private String memberName;

	public Member(int memberID, String memberName) {
		this.memberID = memberID;
		this.memberName = memberName;
	}

    ...
	
	@Override
	public int compareTo(Member member) {  // compareTo() ๋ฉ”์„œ๋“œ ์žฌ์ •์˜. ์ถ”๊ฐ€ํ•œ ํšŒ์› ์•„์ด๋””์™€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ํšŒ์› ์•„์ด๋””๋ฅผ ๋น„๊ตํ•จ
		return (this.memberID - member.memberID);
	}
}

-compareTo( ) ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ์ •์ˆ˜ ๊ฐ’์ด๋‹ค.

๋‘ ๊ฐ’์„ ๋น„๊ตํ•˜์—ฌ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ํšŒ์› ์•„์ด๋””๊ฐ€ ๋” ํฌ๋ฉด ์–‘์ˆ˜, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์Œ์ˆ˜, ๊ฐ™์œผ๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ๋‹ค.

โ€‹

โ€‹

<์‹คํ–‰ ๊ฒฐ๊ณผ>

โ€‹

โ€‹

MemberID๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ ค๋ฉด

@Override
public int compareTo(Member member) {
	return (this.memberID - member.memberID) * (-1);  // ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜ํ™˜ ๊ฐ’์„ ์Œ์ˆ˜๋กœ ๋งŒ๋“ฌ
}

์ด๋ ‡๊ฒŒ ํ•œ๋‹ค.

โ€‹

โ€‹

โ€‹

๋‚˜ ํ˜ผ์ž ์ฝ”๋”ฉ) ํšŒ์› ์ด๋ฆ„์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ

์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ ํšŒ์› ์ด๋ฆ„์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜๋„๋ก compareTo( ) ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ผ.

โ€‹

A)

@Override
public int compareTo(Member member) {
	return this.memberName.compareTo(member.memberName);
}

-compareTo( ) ๋ฉ”์„œ๋“œ ์•ˆ์— String ์ด ํฌํ•จ๋˜์–ด์žˆ์Œ.

โ€‹

โ€‹

โ€‹

*๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋Š” Comparator ์ธํ„ฐํŽ˜์ด์Šค

Comparator ์—ญ์‹œ ์ •๋ ฌ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

Comparator ์ธํ„ฐํŽ˜์ด์Šค๋Š” compare( ) ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” Comparator ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค๋Š” Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

package collection;

import java.util.Comparator;

public class Member2 implements Comparable<Member> {
	private int memberID;
	private String memberName;

	public Member2(int memberID, String memberName) {
		this.memberID = memberID;
		this.memberName = memberName;
	}

    ...
	
	@Override
	public int compare(Member2 mem1, Member2 mem2) {  // compare() ๋ฉ”์„œ๋“œ ์žฌ์ •์˜. ์ „๋‹ฌ๋ฐ›์€ ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋น„๊ตํ•จ
		return mem1.getMemberID() - mem2.getMemberID();
	}
}

-Comparator๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์˜ํ•  ์ ์€ TreeSet ์ƒ์„ฑ์ž์— Comparator๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

โ€‹

package collection.treeset;

import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;

class MyCompare implements Comparator<String> {
	@Override
	public int compare(String s1, String s2) {  // ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
		return (s1.compareTo(s2) * -1);
	}
}

public class ComparatorTest {
	public static void main(String[] args) {
		Set<String> set = new TreeSet<String>(new MyCompare());  // TreeSet ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ •๋ ฌ ๋ฐฉ์‹์„ ์ง€์ •
		set.add("aaa");
		set.add("ccc");
		set.add("bbb");

		System.out.println(set);
	}
}

-์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ์ด๋ฏธ Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ์— ์ด ํด๋ž˜์Šค์˜ ์ •๋ ฌ ๋ฐฉ์‹์„ ์ •์˜ํ•  ๋•Œ Comparator ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (String ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ๋Š” final๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์–ด์„œ ์ƒ์†๋ฐ›์•„ compareTo( ) ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜๋„ ์—†๋‹ค)

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€