3 ๋ถ„ ์†Œ์š”

๐Ÿ“š JAVA


๐Ÿ“š Comparable & Comparator

Comparable & Comparator

Comparable ๊ณผ Comparator ๋Š” ๋ชจ๋‘ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Interface ์ด๋‹ค.
๊ทธ๋ž˜์„œ Comparable ์ด๋‚˜ Comparator ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด์— ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค !

์šฐ๋ฆฌ๋Š” Primitive ํƒ€์ž…์˜ ์‹ค์ˆ˜ ๋ณ€์ˆ˜(byte, int ,double ๋“ฑ๋“ฑ)์˜ ๊ฒฝ์šฐ๋Š” ๋ถ€๋“ฑํ˜ธ๋ฅผ ๊ฐ€์ง€๊ณ  ์‰ฝ๊ฒŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋น„๊ตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ฐ์ฒด์— ๋‚˜์ด์™€ ์ด๋ฆ„๊ณผ ์ฃผ์†Œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ๋‹ค๋ฅธ ๊ฐ์ฒด์™€ ์–ด๋–ป๊ฒŒ ๋น„๊ตํ•  ๊ฒƒ์ธ๊ฐ€?
๊ฐ์ฒด๋Š” ๊ธฐ์ค€์„ ์ •ํ•ด์ฃผ์ง€ ์•Š๋Š” ์ด์ƒ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๋” ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–๋Š”์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์—†๋‹ค.
์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Comparable ์ด๋‚˜ Comparator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์—ฌ๊ธฐ์„œ ๋‘๊ฐ€์ง€์˜ ์ฐจ์ด์ ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋น„๊ตํ•˜๋Š” ๊ฒƒ ์ž์ฒด๋Š” ๊ฐ™์ง€๋งŒ ๋น„๊ต ๋Œ€์ƒ์ด ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฐ‘์—์„œ ๊ฐ๊ฐ ๋‹ค๋ค„๋ณด๊ฒ ๋‹ค.

Comparable

Comparable ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

Comparable์€ ์ž๊ธฐ์ž์‹ ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•œ๋‹ค.
Comparable์—์„œ ์‚ฌ์šฉํ•  ๋ฉ”์„œ๋“œ๋Š” compareTo() ์ด๋‹ค.
์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ๊ธฐ์ค€์„ ์ •์˜ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์ด ๋œ๋‹ค.
์ž๊ธฐ์ž์‹ ๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•œ๋‹ค.

Comparable ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

public class ClassName implements Camparable<Type>{

//  ๊ตฌํ˜„

    @Override
    public int compareTo(Type o){

    //  ๋น„๊ต ๊ตฌํ˜„

    }
}

Comparable ์‹ค์Šตํ•ด๋ณด์ฆˆ์•„!

public class ComparableTest {
	public static void main(String[] args) {
		Student s1 = new Student(15, "jisoo");
		Student s2 = new Student(16, "hoho");
		
		int value = s1.compareTo(s2);   // s1 ์ž๊ธฐ์ž์‹ ๊ณผ s2 ๋ฅผ ๋น„๊ตํ•œ๋‹ค
		
		if(value > 0) {
			System.out.println("s1๊ฐ์ฒด๊ฐ€  s2๊ฐ์ฒด๋ณด๋‹ค ๋” ํฝ๋‹ˆ๋‹ค.");
		}
		else if(value == 0) {
			System.out.println("s1๊ฐ์ฒด์™€ s2๊ฐ์ฒด๊ฐ€ ๊ฐ™์Šต๋‹ˆ๋‹ค.");
		}
		else {
			System.out.println("s1๊ฐ์ฒด๊ฐ€ s2๊ฐ์ฒด๋ณด๋‹ค ๋” ์ž‘์Šต๋‹ˆ๋‹ค.");
		}
	}
}

class Student implements Comparable<Student>{
	int age;
	String name;
	
	
	Student(int age, String name) {
		this.age = age;
		this.name = name;
	}
	
	@Override
	public int compareTo(Student o) {
		return this.age - o.age;
	}		
}

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

s1๊ฐ์ฒด๊ฐ€ s2๊ฐ์ฒด๋ณด๋‹ค ๋” ์ž‘์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ๊ตฌ์กฐ ์„ค๋ช…

โ€˜๊ฐ’โ€™์„ ๋น„๊ตํ•˜์—ฌ int๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.
์ž๊ธฐ์ž์‹ ์˜ ๋‚˜์ด์™€ ๋น„๊ตํ•  ๊ฐ์ฒด์˜ ๋‚˜์ด๋ฅผ ๋นผ์„œ ๊ทธ๊ฒƒ์ด ์–‘์ˆ˜,0,์Œ์ˆ˜ ์ผ ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜์˜€๋‹ค.
์ฆ‰, Comparable์€ ์ž๊ธฐ ์ž์‹ ์„ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์•„ ๋Œ€์†Œ๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•œ๋‹ค.
s1์˜ ๋‚˜์ด๊ฐ€ 15์ด๊ณ  s2์˜ ๋‚˜์ด๊ฐ€ 16์ธ๋ฐ โ€˜ int value = s1.compareTo(s2); โ€˜ ์—์„œ s1์—์„œ s2๋ฅผ ๋น„๊ตํ•œ ๊ฒฐ๊ณผ๋ฅผ value๋ผ๋Š” intํ˜• ๋ณ€์ˆ˜์— ์ €์žฅํ•ด์ฃผ์—ˆ๋‹ค.
๊ทธ ๊ฒฐ๊ณผ -1์ด๋ฏ€๋กœ value๋Š” 0๋ณด๋‹ค ์ž‘์•„์„œ โ€˜s1๊ฐ์ฒด๊ฐ€ s2๊ฐ์ฒด๋ณด๋‹ค ๋” ์ž‘์Šต๋‹ˆ๋‹ค.โ€™๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
์—ฌ๊ธฐ์„œ ๋ฌด์—‡์„ ์ถœ๋ ฅํ•˜๋Š๋ƒ ๊ทธ๊ฒƒ์€ ๋งˆ์Œ๋Œ€๋กœ์ด๋‹ค. ๊ทธ๋ƒฅ ๋‘ ๋น„๊ต๋Œ€์ƒ์˜ ์ฐจ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋„ ๋œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ๋‚˜์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•ˆํ•˜๊ณ  ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด compartTo() ๋ฉ”์„œ๋“œ์—์„œ return ๊ฐ’์„ this.name - o.name ์ด๋ผ๊ณ  ํ•˜๋ฉด ๋œ๋‹ค.
์—ฌ๊ธฐ์„œ this๋Š” s1 ๊ฐ์ฒด ์ž์‹ ์„ ์˜๋ฏธํ•˜๊ณ  o๋Š” s2 ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.


Comparator

Comparator ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

Comparator์€ ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•œ๋‹ค.
Comparator์—์„œ ์‚ฌ์šฉํ•  ๋ฉ”์„œ๋“œ๋Š” compare() ์ด๋‹ค.
์ด ๋ฉ”์„œ๋“œ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•  ๊ธฐ์ค€์„ ์ •์˜ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์ด ๋œ๋‹ค.
๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋น„๊ตํ•œ๋‹ค.
Comparator์€ โ€˜import java.util.Comparatorโ€™ ๊ฐ€ ๊ผญ ์žˆ์–ด์•ผ ํ•œ๋‹ค !

Comparator ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

import java.util.Comparator             //import ํ•„์š”
public class ClassName implements Comparator<Type>{

// ๊ตฌํ˜„


    // ํ•„์ˆ˜ ๊ตฌํ˜„ ๋ถ€๋ถ„
    @Override
    public int compare(Type o1, Type o2){

        // ๋น„๊ต ๊ตฌํ˜„

    }
}

Comparator ์‹ค์Šตํ•ด๋ณด์ฆˆ์•„!

import java.util.Comparator;

public class ComparatorTest {
	public static void main(String[] args) {
		Students s1 = new Students(19, "jisoo");
		Students s2 = new Students(17, "susu");

		int values = s1.compare(s1, s2);

		if (values > 0) {
			System.out.println("s1๊ฐ์ฒด๊ฐ€ s2๊ฐ์ฒด๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค");
		} else if (values == 0) {
			System.out.println("๋‘ ๊ฐ์ฒด์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์Šต๋‹ˆ๋‹ค.");
		} else {
			System.out.println("s1๊ฐ์ฒด๊ฐ€ s2๊ฐ์ฒด๋ณด๋‹ค ์ž‘์Šต๋‹ˆ๋‹ค.");
		}
	}
}

class Students implements Comparator<Students> {
	int age;
	String name;

	public Students(int age, String name) {
		this.age = age;
		this.name = name;
	}

	@Override
	public int compare(Students o1, Students o2) {
		return o1.age - o2.age;
	}
}


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

s1๊ฐ์ฒด๊ฐ€ s2๊ฐ์ฒด๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค

์ฝ”๋“œ ๊ตฌ์กฐ ์„ค๋ช…

Comparable๊ณผ ๊ตฌ์กฐ๋Š” ๊ฑฐ์˜ ๋น„์Šทํ•˜๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Comparator์€ compare() ๋ฉ”์„œ๋“œ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ผ๋ฆฌ ๋น„๊ต๋ฅผ ํ•˜์—ฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
๊ทธ๋ฆฌ๊ณ  โ€˜int values = s1.compare(s1, s2);โ€™ ์ด ๋ถ€๋ถ„์—์„œ compare() ๋ฉ”์„œ๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์ฃผ๋Š” ๊ฐ์ฒด๋Š” ์•„๋ฌด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.


Comparable & Comparator ์™€ ์ •๋ ฌ๊ณผ์˜ ๊ด€๊ณ„

JAVA์—์„œ์˜ ์ •๋ ฌ์€ ํŠน๋ณ„ํ•œ ์ •์˜๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๋Š” ํ•œ โ€˜์˜ค๋ฆ„ ์ฐจ์ˆœโ€™ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.
๋‘ ์ˆ˜์˜ ๋น„๊ต ๊ฒฐ๊ณผ๊ฐ€

  • ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ : ๋‘ ์›์†Œ์˜ ์œ„์น˜๋ฅผ ๊ตํ™˜ ์•ˆ ํ•จ
  • ์–‘์ˆ˜์ผ ๊ฒฝ์šฐ : ๋‘ ์›์†Œ์˜ ์œ„์น˜๋ฅผ ๊ตํ™˜ ํ•จ

โ€˜๋‚ด๋ฆผ ์ฐจ์ˆœโ€™ ์œผ๋กœ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ถ€ํ˜ธ๋ฅผ ๋ฐ˜๋Œ€๋กœ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค .
๊ทธ๋ฆฌ๊ณ  ์ข€ ๋” ์‰ฝ๊ฒŒ ์ดํ•ด๋ฅผ ํ•˜๋ ค๋ฉด ์„ ํ–‰ ์›์†Œ์˜ ๊ฐ’์€ ์ž‘๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ํ›„ํ–‰ ์›์†Œ์˜ ๊ฐ’์€ ํฌ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์Œ์ˆ˜, ์–‘์ˆ˜ ๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

Comparable & Comparator ๋งˆ๋ฌด๋ฆฌ

Comparable๊ณผ Comparator์€ ๊ฐ์ฒด๋“ค์„ ๋น„๊ตํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ํ•„์ˆ˜์š”์†Œ์ด๋‹ค.
์ด์ œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ•˜๋ฉด ๊ฐ์ฒด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํŒŒ์ผ์„ ๋‚˜๋ˆ„๊ณ  ๊ธฐ๋Šฅ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“œ๋Š” ๋“ฑ ๊ฐ์ฒด์ง€ํ–ฅ ์ฝ”๋”ฉ์„ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ—ˆ๋‹คํ•  ๊ฒƒ์ด๋‹ค.
๊ทธ ๊ณผ์ •์—์„œ ๊ฐ์ฒด์˜ ๋น„๊ต๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ˜๋“œ์‹œ ์•Œ์•„๋‘์–ด์•ผ ํ•œ๋‹ค !!

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์‹ค ์—ฌ๋Ÿฌ ๋น„๊ตํ•˜๋Š” ๋ฉ”์„œ๋“œ์—์„œ๋„ Comparable์ด๋‚˜ Comparator๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋‹ค. ๊ทธ ๋œป์€ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ํŠนํžˆ ์ •๋ ฌํ•  ๋•Œ ๋งŽ์ด ์“ฐ์ธ๋‹ค. ์ œ์ผ ๋Œ€ํ‘œ์ ์ธ ์ •๋ ฌํ•˜๋Š” ๋ฉ”์„œ๋“œ์ธ sort()๋„ Comparable๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
๋งŒ์•ฝ sort()๊ธฐ๋Šฅ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋” ๋‚˜์•„๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ •๋ ฌ ์กฐ๊ฑด์„ ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ๋„ ๊ตฌ์กฐ๋ฅผ ์•Œ์•„์•ผ ์•Œ๋งž๊ฒŒ ์ค„ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด์ด๋‚˜ list๋ฅผ ์ •๋ ฌํ•  ๋•Œ๋„ ์ข…์ข… ์“ฐ์ด๊ณค ํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ™•์‹คํ•˜๊ฒŒ ๊ฐœ๋…๊ณผ ๊ตฌ์กฐ๋ฅผ ์•Œ๊ณ  ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์–ด์•ผ ์ƒ๊ฐํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰ ํ•œ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์€ Comparable ๊ณผ Comparator ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ Overflow์™€ Underflow๋ฅผ ๊ผญ ๊ณ ๋ คํ•˜์—ฌ์•ผ ํ•œ๋‹ค !!





๐Ÿ‘ ์ฐธ์กฐ
https://st-lab.tistory.com/243

ํƒœ๊ทธ: , ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: