[Java] Enum 비교 ==? equals?

heiler·2025년 3월 9일

Java

목록 보기
3/4

블랙잭 미션을 진행하던 중 enum 비교에 대한 피드백을 받았는데 그전까지는 ==와 equals 중에 그때그때 내 맘대로 사용했었다.

이번 기회에 둘의 차이에 대해 알아보고 글로 정리해보았다.

✅ Enum 클래스의 equals 구현

Enum 클래스의 equals 내부를 보면 Object 타입을 받아서 == 비교를 하는 것을 확인할 수 있다.

코드만 보면 equals를 사용하면 결국 ==으로 비교하는 것과 같은 것 아닌가? 라는 생각을 할 수 있지만 문득 null 그 녀석이 머리를 스쳐 지나갔다.

  1. equals는 Enum 클래스에 정의된 메서드다.
  2. Enum은 클래스이므로 Enum 객체가 null값을 가질 수 있다.
  3. Enum 객체에 null이 할당된 채로 equals를 호출한다면 NPE가 발생할 것이다.

가설을 증명하기 위해 코드로 살펴보자

👨🏻‍💻 예제 코드

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);
    }
}

✅ Enum 값 비교해보기

@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); // 통과
    });
}

✅ ==와 equals의 차이

▶️ A==B로 비교하면 A와 B가 같은 타입이 아닌 경우 컴파일 타임에 실수를 잡아낼 수 있다.

↔ A.equals(B)는 A와 B의 타입이 달라도 컴파일은 된다.

▶️ A==B로 비교하면 런타임에서 예외가 발생하지 않는다.

↔ A.equals(B)는 런타임에서 A가 null인 경우 NPE가 발생한다.

✅ 무엇을 쓰는 것이 좋을까?

Enum의 equals 메서드 구현체를 보면 "final"로 오버라이드도 못하게 막아두었다.

즉, equals 재정의를 이용한 커스터마이징의 이점도 누리지 못한다.

==을 사용하면 아래의 장점을 가져갈 수 있다.

  1. 컴파일 타임에 타입 불일치 오류를 잡아낼 수 있다.
  2. 런타임에서 NPE가 발생하지 않는다.
  3. equals보다 함수 호출 깊이가 얕아서 equals보다 더 빠르게 동작한다.

Enum 값을 비교할 때는 ==을 사용해보자!

profile
Smiley

0개의 댓글