[Java] compareTo 정리 (정리 중)

jks56486665·2022년 1월 14일
0

자바 정리

목록 보기
1/1

코틀린을 사용하다가 자바를 깊게 사용해보면서 다양한 경험을 할 수 있었다. 자바의 깊이가 생각보다 훨씬 더 깊었던 것 같다. 물론, 코틀린이 사용하는 측면에서 편리하게 만든 부분이 많아서 그에 적응한 것인지 자바로 사용할 때는 사용할 때마다 헷갈리는 경우가 많았다. 그래서 헷갈리는 함수 중 하나인 compareTo를 정리해 보고자 한다.

Comparable

Comparable은 java.lang 패키지에 속해있는 인터페이스로, compareTo를 추상 메소드로 가지고 있다. Comparable 인터페이스를 구현하는 클래스는 객체의 순서를 부여할 수 있게 되는데, 이 순서를 '자연 순서'로 부르고 클래스의 compareTo 메소드를 자연 비교 방법이라 한다.(내부 설명 해석)

각종 비교

compareTo 해석?

자바에서 사용법은 기준.compareTo(대상) 으로 사용한다. 영어를 그대로 해석해보면
(기준)이 있고 (.) 뭘 하냐면 (compare) 비교하는데 (To(대상)) 대상과 비교한다.
그리고 그 결과 값을 int 형으로 반환하게 되어있는데 이 값을 가지고 크다, 같다, 작다를 알 수 있다.
즉, 영어식 관점으로 문장에서 맨 앞에 있는 단어가 중요한 것처럼 반환값은 기준을 기반으로 반환하게 된다.

Instant

시간의 순간 정보를 가지고 있는 Instant 클래스를 이용하여 값 비교를 통해 비교해보자 한다.
다음과 같이 테스트 코드를 작성하였다.

Test1.java
Instant baseTime = Instant.parse("2022-01-15T12:00:00Z");
Instant beforeTime = Instant.parse("2022-01-15T11:59:00Z");
Instant sameTime = Instant.parse("2022-01-15T12:00:00Z");
Instant afterTime = Instant.parse("2022-01-15T12:01:00Z");

System.out.println(baseTime.compareTo(beforeTime));
System.out.println(baseTime.compareTo(sameTime));
System.out.println(baseTime.compareTo(afterTime));

출력 결과는 다음과 같았다

1
0
-1

그림으로 보면 다음과 같다.

(기준 시간)과 (과거 시간, 같은 시간, 미래 시간)을 비교했을 때:
기준 시간 (compareTo) 과거 시간 = 1 => 기준 시간이 크다
기준 시간 (compareTo) 같은 시간 = 0 => 기준 시간과 같다
기준 시간 (compareTo) 미래 시간 = -1 => 기준 시간이 작다

이 결과를 값으로 치환하여 다음과 같이 이해하면 좋을 것 같다.
기준 compare 대상 = 1 => 기준을 대상과 비교(compare) 했더니 결과가(To) 크다
기준 compare 대상 = -1 => 기준을 대상과 비교(compare)했더니 결과가(To) 작다

기준 > 대상 (1)
기준 = 대상 (0)
기준 < 대상 (-1)

Integer 비교

compareTo를 조건으로 사용하는 경우가 많은데 다음 두 코드는 같은 결과를 반환한다.

Test2.java
Integer base = 10;
Integer low = 8;

if (base.compareTo(low) > 0) {
	System.out.println("기준이 크다");
}

if (base > low) {
	System.out.println("기준이 크다");
}

다시 돌아와서 Instant도 같은 느낌의 조건문 작성이 가능하다

Test3.java
Instant baseTime = Instant.parse("2022-01-15T12:00:00Z");
Instant targetTime = Instant.parse("2022-01-15T12:00:01Z");

if (baseTime.compareTo(targetTime) < 0) {
	System.out.println("기준 시간이 더 과거일 때");
} else if (baseTime.compareTo(targetTime) > 0) {
	System.out.println("기준 시간이 더 미래일 때");
}

if (baseTime.toEpochMilli() < targetTime.toEpochMilli()) {
	System.out.println("기준 시간이 더 과거일 때");
} else if (baseTime.toEpochMilli() > targetTime.toEpochMilli()) {
	System.out.println("기준 시간이 더 미래일 때");
}

String

아직 정리하지 않았다. 사실 String에서 사용할 일이...

정리

정리하면 compareTo는 풀어쓴 코드를 깔끔하게 정리할 수 있지만 의미를 정확하게 모르고 사용한다면 한 번에 이해가 안 될 수도 있기 때문에 정확하게 모른다면 그것을 풀어서 사용하는 것이 더 바람직하다고 생각한다. 하지만 코드 길이가 늘어나는 것이 싫은 나같은 사람은 조금이라도 줄이기 위해서 이해하는 것도 좋다고 생각한다.

profile
하고 싶은 것이 많은 사람

0개의 댓글