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

[JAVA] Comparable? Comparator?

by ๋Œ€๋ณต2 2024. 7. 23.

 

์„œ๋ก 

๊ฐ์ฒด ๊ฐ„์˜ sort๋ฅผ ์ˆ˜ํ–‰ํ•˜๋˜ ์ค‘ Comparable์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ๊ณผ Comparator๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด ์กด์žฌํ•ด ๋‘˜ ์ค‘ ์–ด๋–ค ๊ฑธ ์–ด๋А ์ƒํ™ฉ์— ์จ์•ผ ํ•˜๋‚˜..๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค.

 

 

๊ณตํ†ต์ 

- ๋ชจ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.

- ์›ํ•˜๋Š” ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•˜๊ณ , ๊ฐ๊ฐ ์š”๊ตฌ๋กœ ํ•˜๋Š” ๋ฉ”์„œ๋“œ(๋น„๊ต ๋ฉ”์„œ๋“œ)๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

Comparable

- compareTo(T o) return: int

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

- ์ž๊ธฐ ์ž์‹ ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๊ฐ€ ๋” ํฌ๋ฉด ์–‘์ˆ˜, ์ƒ๋Œ€๊ฐ€ ๋” ํฌ๋ฉด ์Œ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

- ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ ์ข€ ๋‹ค๋ฅธ๋ฐ, ๊ธฐ์ค€๊ฐ’์— ๋น„๊ต๋Œ€์ƒ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด, ์„œ๋กœ์˜ ๋ฌธ์ž์—ด ๊ธธ์ด์˜ ์ฐจ์ด๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

- ๋ญ”์†Œ๋ฆฌ๋ƒํ•˜๋ฉด ์˜ˆ์‹œ๋ฅผ ๋ณด์ž

String str = "abcd";

System.out.println(str.compareTo("abcd")); // ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— 0์ด ๋‚˜์˜จ๋‹ค.
System.out.println(str.compareTo("ab")); // abcd์•ˆ์— ab๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๋ฌธ์ž์—ด์˜ ์ฐจ์ด์ธ 2
System.out.println(str.compareTo("a")); // ๊ฐ™์€ ์ด์œ ๋กœ 1
System.out.println(str.compareTo("c")); //์ด ์นœ๊ตฌ๋Š” -2๊ฐ€ ๋‚˜์˜จ๋‹ค.
// ๊ฐ™์€ ์œ„์น˜์˜ ๋ฌธ์ž๋งŒ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฒซ๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•ด ๋‹ค๋ฅด๋ฉด ์•„์Šคํ‚ค๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋น„๊ตํ•œ๋‹ค.

 

 

Comparator

- compare(T o1, T o2) 

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

- compare๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•  ๊ฐ์ฒด๊ฐ€ ๋ณ„๋„๋กœ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ Comparator๋ฅผ ์ •๋ง ๋น„๊ต์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ตณ์ด ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๊ธฐ์—” ์•„๊นŒ์šด ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด

์ต๋ช… ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ƒ๊ฒผ๋‹ค.

 

 

 

์ต๋ช… ๊ฐ์ฒด

- ๋ง ๊ทธ๋Œ€๋กœ ์ด๋ฆ„์ด ์ •์˜๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋‹ค.

- ์ฃผ๋กœ ํŠน์ • ๊ตฌํ˜„ ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์ค‘๊ฐ„์— ์ˆ˜์ •๋œ ์ฝ”๋“œ๋ฅผ ์ž ๊น ์ด์šฉํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

public static void main(String[] args) {
	
		Person a = new Person();
		
		// ์ต๋ช… ๊ฐ์ฒด ์„ ์–ธ!!
		Person b = new Person() {
		    	int age;
			@Override
			int get() {
				return age;
			}
		};
        
        System.out.println(a.get());
        System.out.println(b.get());
}


//////

class Person{
    String name;
    int height;
    
    int get(){
    	return height;
    }
}

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด b์—๋Š” Person์˜ ๊ฐ์ฒด๋ฅผ ์ด์–ด๋ฐ›์•„ get()์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ–ˆ์ง€๋งŒ, ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ด๋ฆ„์€ ๋”ฐ๋กœ ์ง€์ •๋˜์–ด์žˆ์ง€ ์•Š์€๋ฐ, ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๊ฐ€ ์ต๋ช… ๊ฐ์ฒด๋‹ค.

์—ฌ๊ธฐ์„œ ์‚ดํŽด๋ณผ ์ ์€ ์ € b์— ์ €์žฅ๋œ ์ต๋ช…๊ฐ์ฒด๋Š” ๊ธฐ์กด์˜ Person์ด ๊ฐ€์ง€๊ณ  ์žˆ๋˜ name๊ณผ height ์™ธ์— age๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ์–ด๋””์„œ ๋งŽ์ด ๋ณธ ๋ฐฉ์‹์ธ๋ฐ.. ํ•˜๊ณ  ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์ƒ์†๋œ ํด๋ž˜์Šค์™€ ๊ฐ™์€ ํ˜•ํƒœ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ƒ์„ฑ๋˜๋Š” ์ต๋ช… ๊ฐ์ฒด๋Š” ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์ƒ์† ๊ด€๊ณ„์ด๋ผ๋Š” ๋ง์ด ๋œ๋‹ค.

 

 

 

 

์ต๋ช… ๊ฐ์ฒด๋กœ Comparator ๊ตฌํ˜„ํ•˜๊ธฐ

์ต๋ช… ๊ฐ์ฒด๊ฐ€ ๋ญ ํ•˜๋Š” ๊ฐ์ฒด์ธ์ง€๋„ ์•Œ์•˜๊ณ , Comparator๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋Œ์•„๊ฐ€๋Š”์ง€๋„ ์•Œ์•„๋ณด์•˜๋‹ค. ์ด์ œ ์ด ๋‘˜์„ ์ž˜ ์—ฎ์–ด์„œ Comparator๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•  ์ต๋ช… ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋‘ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•ด ์ฃผ๋Š” compare ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฉด compare๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

public static void main(String[] args) {
	Person a = new Person("ํ˜ธ๋‚ ๋‘", 186);
	Person b = new Person("๋ฉ”์‹œ", 170);
	Comparator<Person> comp = new Comparator<Person>() {
		@Override
		public int compare(Person p1, Person p2){
   	         	return p1.height - p2.height;
       		}
	};
        
	System.out.println(comp.compare(a, b));
}


//////

class Person{
    String name;
    int height;
    
    Person(String name, int height){
    	this.name = name;
        this.height = height;
    }
}

 

 

์ด๋Ÿฐ ๋ฐฉ์‹์˜ ์žฅ์ ์€ ๋”ฐ๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ๋น„๊ต ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์žˆ๋‹ค. 

์ž๋งคํ’ˆ์œผ๋กœ ์ •๋ ฌ์„ ์ด์šฉํ•  ๋•Œ, Arrays.sort(arr, comp)์™€ ๊ฐ™์ด ์ต๋ช… ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

 

 

 

์ •๋ ฌ ๊ฟ€ํŒ(?)

- ์ •๋ ฌ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘ ์ˆ˜๋ฅผ ๋น„๊ตํ•ด์„œ ์Œ์ˆ˜ ๋˜๋Š” ์–‘์ˆ˜์— ๋”ฐ๋ผ ๊ตํ™˜์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

- ์ž๋ฐ”๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์ง€ํ–ฅํ•˜๊ณ  ์žˆ๋‹ค.

- a - b๊ฐ€ ์Œ์ˆ˜๋ผ๋ฉด a๊ฐ€ ๋” ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ๊ตํ™˜์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

- a - b๊ฐ€ ์–‘์ˆ˜๋ผ๋ฉด a๊ฐ€ ๋” ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ตํ™˜์ด ์ด๋ฃจ์–ด์ง„๋‹ค.

 

a - b์˜ ๊ฒฐ๊ณผ ๋ถ€ํ˜ธ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค๋ฉด? => ๋‚ด๋ฆผ์ฐจ์ˆœ์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

'Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[JAVA] Stream API  (0) 2024.07.25
[JAVA] Lambda  (0) 2024.07.24
[JAVA] Generic  (3) 2024.07.22
[JAVA] ์ถ”์ƒ  (1) 2024.07.20
[JAVA] ๋‹คํ˜•์„ฑ  (2) 2024.07.18