
블랙잭 미션을 진행하던 중 enum 비교에 대한 피드백을 받았는데 그전까지는 ==와 equals 중에 그때그때 내 맘대로 사용했었다.
이번 기회에 둘의 차이에 대해 알아보고 글로 정리해보았다.

Enum 클래스의 equals 내부를 보면 Object 타입을 받아서 == 비교를 하는 것을 확인할 수 있다.
코드만 보면 equals를 사용하면 결국 ==으로 비교하는 것과 같은 것 아닌가? 라는 생각을 할 수 있지만 문득 null 그 녀석이 머리를 스쳐 지나갔다.
가설을 증명하기 위해 코드로 살펴보자
import java.util.Arrays;
public enum AttendanceStatus {
ATTENDANCE("출석"),
LATE("지각"),
ABSENT("결석"),
;
private final String title;
AttendanceStatus(String title) {
this.title = title;
}
public static AttendanceStatus from(String title) {
return Arrays.stream(values())
.filter(t -> t.title.equals(title))
.findAny()
.orElse(null);
}
}
@Test
void enum_test() {
AttendanceStatus status = AttendanceStatus.from("출석");
assertThat(status == AttendanceStatus.ATTENDANCE).isEqualTo(true); // 통과
assertThat(status.equals(AttendanceStatus.ATTENDANCE)).isEqualTo(true); // 통과
assertThat(AttendanceStatus.ATTENDANCE == status).isEqualTo(true); // 통과
assertThat(AttendanceStatus.ATTENDANCE.equals(status)).isEqualTo(true); // 통과
}
@Test
void enum_test2() {
AttendanceStatus status = AttendanceStatus.from("null이지롱");
SoftAssertions.assertSoftly(softAssertions -> {
softAssertions.assertThat(status == AttendanceStatus.ATTENDANCE).isEqualTo(false); // 통과
softAssertions.assertThat(status.equals(AttendanceStatus.ATTENDANCE)).isEqualTo(false); // NPE 발생!
softAssertions.assertThat(AttendanceStatus.ATTENDANCE == status).isEqualTo(false); // 통과
softAssertions.assertThat(AttendanceStatus.ATTENDANCE.equals(status)).isEqualTo(false); // 통과
});
}
▶️ A==B로 비교하면 A와 B가 같은 타입이 아닌 경우 컴파일 타임에 실수를 잡아낼 수 있다.
↔ A.equals(B)는 A와 B의 타입이 달라도 컴파일은 된다.
▶️ A==B로 비교하면 런타임에서 예외가 발생하지 않는다.
↔ A.equals(B)는 런타임에서 A가 null인 경우 NPE가 발생한다.
Enum의 equals 메서드 구현체를 보면 "final"로 오버라이드도 못하게 막아두었다.
즉, equals 재정의를 이용한 커스터마이징의 이점도 누리지 못한다.
==을 사용하면 아래의 장점을 가져갈 수 있다.
Enum 값을 비교할 때는 ==을 사용해보자!