정렬?

리스트 같은 자료구조 객체에서 정렬되어 있는 순서를 바꿀때 사용.

원시타입(primitive, 기본형)을 일반적으로 사람들에 통용되는 기준이 있다. 가령 2는 1보다 크다 등등

사용자가 정의한 클래스의 객체의 정렬은 뭐를 기준점으로 둘것인가? 는 개발자가 정의해줘야만 한다.(예를들어 필드가 생년월일과 이름을 가진 객체들이 있다면, 이 객체의 정렬기준은 생년월일이 빠른사람으로 기준으로 하겠다 라고)

 

자바에서 제공하는 정렬 관련 인터페이스는 Comparable, Comparator.

결론부터 말하자면, Comparable은 클래스 자체의 코드를 수정 가능할 때 사용하면 되고, Comparator은 클래스의 수정이 불가능할때(라이브러리 라덩가) 사용하면 된다. 말그대로 comperator는 정렬기 같은 느낌으로 이해하자.

  • Comparable
      • 클래스에서 comparable을 implements하고, compareTo 메소드를 오버라이딩 하면 됨
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    public class ComparableStudy {
        public static void main(String[] args) {
            List<Person> people = new ArrayList<>();
            people.add(new Person(900101"김구라"));
            people.add(new Person(951231"최팩트"));
            
            //정렬 전에는 김구라, 최팩트 순으로 되어있고,
            Collections.sort(people);
            //정렬 후에는  최팩트, 김구라 순으로 되어있음.
        }
    }
     
    class Person implements Comparable<Person> {
        //셋터, 겟터가 들어가면 코드가 길어지니 public으로 함.
        public int idNumber;
        public String name;
                
        public Person(int idNumber, String name) {
            super();
            this.idNumber = idNumber;
            this.name = name;
        }
        
        @Override
        public int compareTo(Person o) {
            if(this.idNumber > o.idNumber){
                return -1;
            }
            return 0;
        }
    }
    cs

     

  • Comparator
      • Comparator 인터페이스를 compare메쏘드를 오버라이딩하여 객체로 생성해서 사용.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    public class ComparatorStudy {
     
        public static void main(String[] args) {
            List<Student> students = new ArrayList<>();
            students.add(new Student(900101"김구라"));
            students.add(new Student(951231"최팩트"));
            
            Comparator<Student> studentComparator = new Comparator<Student>() {
                @Override
                public int compare(Student o1, Student o2) {
                    if(o1.idNumber > o2.idNumber){
                        return -1;
                    }
                    return 0;
                }
            };
     
            //정렬 전에는 김구라, 최팩트 순으로 되어있고,
            Collections.sort(students,studentComparator);    
            //정렬 후에는  최팩트, 김구라 순으로 되어있음.
        }    
    }
     
    class Student  {
        //셋터, 겟터가 들어가면 코드가 길어지니 public으로 함.
        public int idNumber;
        public String name;
                
        public Student(int idNumber, String name) {
            super();
            this.idNumber = idNumber;
            this.name = name;
        }
    }
    cs

 

  • CompareTo, Compare 메쏘드의 규칙 : '리턴되는 int값이 음수이면 현재 인스턴스가 비교대상인 인스턴스보다 작고, 양수이면 크고, 0 이면 같도록 하자'

 

더 정리하거나 알아야 할것 : 

성능, 양수 음수 리턴이 의미하는 것

 

참조사이트 : 

https://www.daleseo.com/java-comparable-comparator/

https://jeong-pro.tistory.com/173

https://gmlwjd9405.github.io/2018/09/06/java-comparable-and-comparator.html

 

 

'IT > 자바' 카테고리의 다른 글

자료구조 정리 잘된 곳  (0) 2020.05.13
해쉬코드, 이퀄스  (0) 2020.05.08
해쉬맵  (0) 2020.05.08
자바 디컴파일  (0) 2020.05.07
Volatile 이란?  (0) 2020.05.07

+ Recent posts