-
JAVA의 Comparable, Comparator를 알아보자JAVA/Java 2020. 4. 13. 23:44
가령 "BbAaCc"와 같은 문자열을 "aAbBcC"와 같이 정렬하는 코드를 작성하는 상황이라면
아마도 정렬을 실시하는 코드를 작성하지만 비교 연산을 새로 정의하는 형태로 작성해야 할 것이다. 위 문제의 핵심은
비교 연산의 구현이다.
단순히 문자열을 char배열로 바꾸고 char형을 정렬하는데 비교하자면 ASCII값으로 비교해 버리기에 ABCabc와 같은
형태가 되기 떄문이다.
이렇게 일반적인 정렬 순서가 아닌 새로운 정렬 순서를 정의하고 싶거나 오브젝트를 정렬 시, 오브젝트 정렬에 사용될
값을 지정하는 역할을 하는 인터페이스가 Comparable과 Comparator이다.
위 코드에서 사용된 Arrays의 sort메서드는 배열의 타입이 참 조형일 경우 Comparable, Comparator 인터페이스를 구현하여 정렬 순서가 정의된 자료형만 정렬할 수 있다. 위에 String은 참조 자료형이므로 내부적으로 이미 Comparable 인터 페이스를 구현한 상태이다
일반적인 오브젝트를 예로 들어보자.
당연히 위 코드는 Arrays가 Fruit의 어느 속성을 참고하여 정렬할 것인지 정의하지 않았으므로 다음과 같은 에러를 보게
된다.
그럼 이제 우리가 의도한 바와 같이 특성 속성을 가지고 정렬이 되도록 Comparable 인터페이스를 구현하고 compareTo
메서드를 오버 라이딩해보자.
다음과 같이 새롭게 정의한 Fruit 클래스는 Comparable 인터페이스를 구현하고 CompareTo() 메서드를 오버 라이딩
하였으므로 Arrays는 이 정보를 이용해 정렬을 수행할 수 있다. 이제 다음과 같은 결과를 얻을 수 있다.
Fruit 내부의 compareTo 메서드를 정의하는 것이 어찌 보면 귀찮은 일이다. 따라서 이런 경우
Array.sort 에서 익명 내부 클래스로 구현한 Comparator을 통해 편리하게 바로 대소 관계를 정의할 수 도있다.
'JAVA > Java' 카테고리의 다른 글
왜 Wrapper 클래스는 쓰이는 걸까? (1) 2020.05.21 객체의 해시코드(hashCode())란 (0) 2020.05.19 자바의 다형성 이란? (0) 2020.03.30 자바의 리플렉션 (0) 2020.03.28 자바의 추상 클래스와 인터페이스 (0) 2020.03.28