파파비의 블로그

Comparable vs Comparator in Java // Sort 로직 구현하기 본문

개발/java

Comparable vs Comparator in Java // Sort 로직 구현하기

N. Dave 2020. 9. 23. 11:21
반응형

Arrays 나 Collections 에는 .sort라는 메소드가 붙어 있다.

우리는 여기에 int[] 처럼 이런 배열들을 넣고 sort를 진행한다.

JAVA API문서를 살펴보면 sort의 성능은 merge sort급으로, n log n 의 속도를 자랑해서 매우 빠르다.

 

그런데 문제가 있다

우리가 만든 객체를 sort하고 싶으면 어떻게 하지?

sort 관련 알고리즘을 직접짜서 돌려야 하나...? 정답은 NO~

그런것들은 java가 알아서 해줄테니 기준만 정해서 알려주면 된다.

 

1) Comparable 

우리가 어떤 class를 만들거나 어떤 객체를 저 collections의 sort 메소드를 통해 정렬을 시키고 싶다면

Comparable 인터페이스를 구현하면된다.

 

구현은 저 compareTo 메소드만 하면 되고, 

Comparable<T>에서 T에 원하는 타입을 넣으면, 그 타입에 해당하는 것이 compareTo의 인자가 된다.

 

아무튼 여기서 중요한 것이 있는데

이 메소드는 2개의 객체를 비교하고, 하나는 본인을 의미한다.

당연히 class 선언할 때니까, 본인인과 새로받은 객체를 비교하게 되는 것이다.

 

그리고 여기서 로직은, 두개 비교했을 때

본인이 크면 양수를 return

작으면 음수를 return

같으면 0을 return 하면 된다,

(보통은 양수를 1, 음수를 -1로 지정해둔다. 굳이 큰 수를 지정할 필요는 없기 때문에..)

 

이렇게 2개를 비교했을 때,

어떤게 더 크고 작은지 로직을 제안해주면,

이를 기반으로 알아서 java가 sort를 진행해준다.

 

결과

여기를 보면 객체를 만들고, List에 해당 객체를 넣어서 sort를 진행했다.

위에 labtop class에서 comparable를 구현했기 때문에 sort가 되는 것이다.

(구현 안했으면 빨간줄 그어지면서 뭐라고 함).

 

 

 

사실은 int나 string객체들 전부다 comparable를 구현했기 때문에 그전에 자연스럽게 sort가 됐던 것이다.

>> Int의 코드를 살펴보면 Comparable를 구현한 것을 알 수 있다.

 

 

 

 

 

2) Comparator 

Comparator 이 친구는 왜 존재할까? 이 친구는 우리가 Comparable를 구현할 수 없을 때 쓰인다.

예를 들어 라이브러리에서 가져왔거나 등등의 기타 이유로 코드에 손을 댈 수 없는 상황에서는

인터페이스 구현이 어려우니 Comparator라는 객체를 활용하면 되는 것이다.

여기를 보면 sort에 오버라이딩이 되어 총 2개의 메소드가 있는 것을 알 수 있다.

두번째꺼를 보면 Comparator를 넣을 수 있게 되어 있다.

Comparator의 compare 메소드를 오버라이드하여 비교 로직을 넣어주면 자바는 이 기준으로 sort를 진행하게 된다.

 

정확한 의미는 코드를 통해 살펴보자

 

1. 일단 labtop 객체는 아무 것도 implement된게 없어서 Collections에 sort를 사용할 수 없다.

그래서 여기서도 sort에 빨간 줄이 그어지며 뭔가 이상하다고 알려준다.

 

그래서 이번엔 Comparator를 만들어서 넣어보자.

참고로 Comparator는 인터페이스다. 메소드 구현이 필요하여,

객체를 생성할 때 바로 메소드 구현까지 같이 해주었다.

 

이제 Comparator인터페이스를 구현한 comparator 객체는 labtop의 가격을 비교하는 기준을 가지게 되었다.

실제로 아까처럼 결과가 잘 나온다

특이한 점은 아까와는 다르게

2개의 객체가 들어온다는 점이다.

그래서 앞에꺼가 크면 양수, 뒤에꺼가 크면 음수를 도출하도록 로직을 구현해두었다.

 

 

영어로 된 영상이지만 워낙 설명이 잘 되어 있어서,

공유한다.

 

www.youtube.com/watch?v=oAp4GYprVHM

 

백준 문제도 풀어보면 좋을듯 하다.

++www.acmicpc.net/problem/11650

 

11650번: 좌표 정렬하기

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

www.acmicpc.net

 

 

반응형

'개발 > java' 카테고리의 다른 글

필터스트림  (0) 2020.04.07
스트림의 개념과 file IO stream  (0) 2020.04.07
자바의 try-catch, throws, throw /예외처리  (0) 2020.04.05
Thread 쓰레드  (0) 2020.04.05
인터페이스  (0) 2020.04.05
Comments