본문 바로가기
Today I Learned 2024. 5. 20.

(24.05.20)[6주차] compare, compareTo 메서드 비교 & 사용자 정의 Comparator 활용

 

Spring 숙련 주차에 들어섰기 때문에 이번주에도 역시 5주차와 같이 숙련주차에서 심화 되는 내용을 정리하고

복습하고 예습을 블로그 TIL을 통해서 할 예정

 

오늘은 CODE KATA에서 좋은 Comparator 활용 예시를 할 기회가 생겼기 때문에 이 부분도 그냥 넘어가지 않고

한번더 찾아서 공부하면서 정리했다.


CODE KATA

compare, compareTo 비교 & 사용자 정의 Comparator 활용

더보기
import java.util.*;
import java.util.ArrayList;

class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = {};
        ArrayList<String> stringsList = new ArrayList<>(Arrays.asList(strings));

        Collections.sort(stringsList, new Comparator<String>(){
            @Override
            public int compare(String string1, String string2) {
            // n번쨰 인덱스에 대한 비교
                char char1 = string1.charAt(n);
                char char2 = string2.charAt(n);
                if (char1 != char2){
                    return Character.compare(char1, char2);
                } else {
                    return string1.compareTo(string2);
                }
            }
        } );
    
        answer = stringsList.stream().toArray(String[]::new);
        return answer;
    }
}
  • strings 배열의 String 타입 인덱스 값들의 n번 인덱스끼리 알파벳을 비교해서 정렬하되, 같을 경우는 String의 사전의 값에 의한 정렬
  • Collections.sort(배열, Comparator.reverseOrder()) 처럼 Comparator 클래스에 이미 정의된 메서드가 아닌 사용자 정의의 기준을 사용해서 Comparator를 사용하는 연습
    • IntelliJ의 자동 완성이 되는 부분을 찾으면서 분석

Comparator 사용

  • 위의 코드에서 Collections.sort() 메서드 내 사용자 정의 Comparator를 만들어야 하기 때문에 새로운  Comparator 객체를 만들어 적용해야. 따라서 new Compararator로 새로운 객체 생성 필수
    • <String> Generics에 관해서 컴파일러가 안정성을 보장하지 못한다고 계속 오류가 발생해서 무조건 써줬어야함
    • 배열의 값에 뭐가 올지도 모르고 따라서, Unchecked Exception인 RuntimeException이 발생할 가능성이 매우 높기 때문에 반드시 안정성을 위해 추가 -> 그냥 한 묶음으로 사용하도록
  •  새로운 클래스를 파서, 거기에 새로운 Comparator 객체를 만들고 compare에 대한 메서드를 오버라이드해서 새롭게 정의를 할 수도 있으나, new Comparator<다루는 타입=지네릭스>() {내용} 통째로 넣을 수 있음

Compare & CompareTo 분석

  • Compare과 CompareTo는 각각 Comparator과 Comparable 인터페이스를 이루는 메서드로 기존 학습때는 반드시 오버라이드를 해야한다고 학습
  • 단, 위 코드에서는 각각 Character 클래스, String 클래스에 각각 Comparator와 Comparable이 이미 구현되어 있기 때문에 바로 사용이 가능한것!!
    • Character클래스에 compareTo가 구현이 되어있지만, pirmitive type일 경우엔 직접 char1.compareTo(char2) 처럼 직접 가져와서 쓸수 없음!!!!(String일 경우엔 primitive가 아닌 참조형이기 때문에 바로 사용)
    • String크래래스에는 compare메서드가 굳이 구현이 되어있지 않음!! (인덱스값이 같으면 String자체를 비교를 해야하므로 Sting클래스의 compareTo를 사용해서 자체 사전적으로 정의를 할 수 있도록 코드)

 


비가 너무 많이와서 컨디션이 너무 최악인데, 그래도 콜라와 커피의 카페인으로 버텨보기.!