본문 바로가기
스터디/JAVA

[JAVA] enum 비교는 equals 일까 == 일까?

by zoodi 2024. 4. 28.
728x90

목차

     

     

     

    1. enum 비교 equals

    <예시 코드>

    public void test(NotificationType notificationType) {
    	// case1) enum 값을 앞에 작성
    	if (NotificationType.DONE.equals(notificationType) {
    		...
    	}
    
    	// case2) enum 값을 뒤에 작성
    	if (notificationType.equals(NotificationType.DONE) {
    		...
    	}
    
    	// case3) == 비교
    	if (notificationType == NotificationType.DONE) {
    		...
    	}
    }

     

    위 코드는 메소드의 파라미터로 넘어온 값(notificationType) 을 알림타입 enum 값(NotificationType.DONE) 을 비교하는 코드입니다.

    case 1 ~ 3 모두 값이 동일한지 비교하고있는데요 euqlas 메소드를 더 자세히 살펴보면 내부적으로 == 비교 연산자를 사용하는 것을 알 수 있습니다.

     

     

    2. equals 내부 구현 코드

    public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
           ...
        }

     

    equals도 내부적으로 ==비교를 통해 주소 값을 비교하고있습니다.

     

    그렇다면 equals와 ==를 사용하는 것의 차이점은 무엇일까요?

     

     1) == 연산자를 사용하면 컴파일 시 타입 미스 매치를 잡고

     2) 런타임시에는 npe가 발생하지 않아 null safe 합니다.

     

    3. null 테스트

    void enum_test() {
    
        NotificationType noti = null;
    
        assertThat(noti == NotificationType.DONE).isEqualTo(false); //pass
        assertThat(noti.equals(NotificationType.DONE)).isEqualTo(false); //npe 발생!!
    
        assertThat(NotificationType.DONE == noti).isEqualTo(false); //pass
        assertThat(NotificationType.DONE.equals(noti)).isEqualTo(false); //pass
    }

     

    4. 정리

    • equals를 쓰던 ==를 쓰던 크게 상관이없습니다.
    • == 는 npe를 발생시키지 않습니다. (null safe)
    • ==는 컴파일 시 타입 미스 매치를 잡아줍니다. (equlas는 그대로 컴파일)
    • equals를 사용하면 런타임에 npe가 발생할 수 있습니다.
    • 단 equals 를 쓴다면 enum 상수가 앞으로 오게 비교해야 npe 발생을 방지합니다.
      • => enum 값이 아니더라도 변하지 않는 값들은 앞에 작성해서 비교하는 것이 좋습니다.
    • 팀 내에서 표준을 정하고 사용하면된다!

     

     


    참고 문서:

    https://dev-jwblog.tistory.com/169

    https://stackoverflow.com/questions/1750435/comparing-java-enum-members-or-equals

    728x90

    댓글