Deep_Dev

 

 

๐Ÿ“š Comparable & Comparator

 

 

- Comparable๊ณผ Comparator๋Š” ๋ชจ๋‘ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

- ์ฆ‰, ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด์— ์„ ์–ธ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ ํ•ด์•ผํ•œ๋‹ค.

 

๋ณดํ†ต Comparable ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” compareTo(T o) ๋ฉ”์†Œ๋“œ ํ•˜๋‚˜๊ฐ€ ์„ ์–ธ๋˜์–ด์žˆ๋‹ค. ์ด๊ฒƒ์€ compareTo ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜(Override)ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

Comparator์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด compare ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ณ , Comparable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด compareTo ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.

 

โœ… Comparable & Comparator

" ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๋‹ค "

Why ? ์›๋ž˜๋Š” byte, int, double ๋“ฑ ๋ถ€๋“ฑํ˜ธ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๋‘ ๋ณ€์ˆ˜๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•œ๋‹ค๋ฉด ? ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•™์ƒ์˜ ๋‚˜์ด์™€ ํ•™๊ธ‰ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ ์žˆ๋Š” ํด๋ž˜์Šค์—์„œ ๋‘ ๊ฐ์ฒด (a,b)๋ฅผ ๋น„๊ตํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€? ๋‚˜์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•  ์ˆ˜๋„์žˆ๊ณ , ํ•™๊ธ‰์„ ๊ธฐ์ค€์œผ๋กœ ํ•  ์ˆ˜๋„์žˆ๋‹ค.

์ฆ‰, Comparable๊ณผ Comparator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” '๊ธฐ์ค€'์„ ์ •ํ•ด ์ •๋ ฌ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

public interface Comparator<T> {
	int compare(T o1, T o2)
}

 

Comparable์€ ์ž๊ธฐ ์ž์‹ ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•˜๊ณ  // compareTo(T o)

Comparator๋Š” ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•œ๋‹ค. // Compare(T o1, T o2)

 

CompareTo()์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ Int์ง€๋งŒ ๋‘ ๊ฐ์ฒด๊ฐ€ ๊ฐ™์œผ๋ฉด 0, ๋น„๊ตํ•˜๋Š” ๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ์–‘์ˆ˜, ์ž‘์œผ๋ฉด ์Œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผํ•˜๊ณ ,

Compare()๋„ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•ด์„œ ์Œ์ˆ˜, 0, ์–‘์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.( ์˜ค๋ฅธ์ชฝ์ด ํฌ๋ฉด ์Œ์ˆ˜, ์ž‘์œผ๋ฉด ์–‘์ˆ˜ )

 

 > Comparable์€ lang ํŒจํ‚ค์ง€์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— import๋ฅผ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ, Comparator๋Š” util ํŒจํ‚ค์ง€์— ์žˆ๋‹ค.

 

Comparable

์ž๊ธฐ ์ž์‹ ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•œ๋‹ค.

public class ClassName implements Comparable<Type> {
	
    // ํ•„์ˆ˜ ๊ตฌํ˜„
    public int compareTo(Type o) {
    	/*
        ๋น„๊ต๊ตฌํ˜„
        */
    }
}

 

> ์˜ˆ์‹œ

class Student implements Comparable<Student> {
 
	int age;
	int class;
	
	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๋Š” int๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š”๋ฐ, "์ž๊ธฐ ์ž์‹ ์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ๋Œ€๋ฐฉ๊ณผ ์–ผ๋งˆ๋‚˜ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š๋ƒ"๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ผญ 1, -1๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ์–‘์ˆ˜, ์Œ์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•ด๋„ ๋˜๊ธดํ•˜์ง€๋งŒ ์ถ”์ฒœ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.

๋‘ ์ˆ˜์˜ ์ฐจ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์„ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด UnderFlow ๋˜๋Š” OverFlow๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ <, >, = ๋กœ ๋Œ€์†Œ ๋น„๊ต๋ฅผ ํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค.

 

Comparator

๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•œ๋‹ค.

import java.util.Comparator;	// import ํ•„์š”
public class ClassName implements Comparator<Type> { 
 
	// ํ•„์ˆ˜ ๊ตฌํ˜„ ๋ถ€๋ถ„
	@Override
	public int compare(Type o1, Type o2) {
		/*
		 ๋น„๊ต ๊ตฌํ˜„
		 */
	}
}

 

 

> ์˜ˆ์‹œ

import java.util.Comparator;	// import ํ•„์š”
class Student implements Comparator<Student> {
 
	int age;
	int class;
	
	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;
		}
	}
}

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋“ค์–ด์˜ค๋Š” ๋‘ ๊ฐ์ฒด o1, o2๋ฅผ ๋น„๊ตํ•œ๋‹ค.

a.compare ๋ฉ”์†Œ๋“œ์—์„œ a์™€ ๋น„๊ตํ•˜๊ณ ์‹ถ๋‹ค๋ฉด

a.compare(a,b); ๋กœ ํ•˜๋ฉด๋œ๋‹ค.

 

 

 

 


https://st-lab.tistory.com/243?category=830901

 

์ž๋ฐ” [JAVA] - Comparable ๊ณผ Comparator์˜ ์ดํ•ด

์•„๋งˆ ์ด ๊ธ€์„ ์ฐพ์•„ ์˜ค์‹  ๋ถ„๋“ค ๋Œ€๊ฐœ๋Š” Comparable๊ณผ Comparator์˜ ์ฐจ์ด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฑฐ๋‚˜ ๊ถ๊ธˆํ•ด์„œ ์ฐพ์•„์˜ค์…จ์„ ๊ฒƒ์ด๋‹ค. ์‚ฌ์‹ค ์•Œ๊ณ ๋ณด๋ฉด ๋‘ ๊ฐœ๋Š” ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ต์ง€ ์•Š์œผ๋‚˜ ์•„๋ฌด๋ž˜๋„ ์ž๋ฐ”๋ฅผ ํ•™์Šตํ•˜๋ฉด์„œ ๊ฐ

st-lab.tistory.com

ํ•ด๋‹น ์ฃผ์†Œ์—์„œ ์ฐธ๊ณ ํ•˜์˜€์œผ๋ฉฐ, ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•ด๋‹น ๋งํฌ์—์„œ ํ™•์ธํ•˜์‹œ๊ธธ๋ฐ”๋ผ๊ฒ ์Šต๋‹ˆ๋‹ค.