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

2024. 4. 28. 14:05·스터디/JAVA
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
    저작자표시 비영리 변경금지 (새창열림)

    '스터디 > JAVA' 카테고리의 다른 글

    [JAVA] gson에서 Deserialize, Serialize, TypeAdaptor 적용하기  (1) 2025.01.22
    [JAVA] 타임존 알아보기 Instant, LocalDateTime, ZonedDateTime  (0) 2024.07.02
    [JAVA] Junit InvalidTestClassError 오류 원인과 해결 방법  (0) 2024.01.29
    [JAVA] Mac M1, M2 openjdk17 설치하기  (0) 2024.01.28
    [JAVA] Mac homebrew 설치 및 사용 방법  (1) 2024.01.27
    '스터디/JAVA' 카테고리의 다른 글
    • [JAVA] gson에서 Deserialize, Serialize, TypeAdaptor 적용하기
    • [JAVA] 타임존 알아보기 Instant, LocalDateTime, ZonedDateTime
    • [JAVA] Junit InvalidTestClassError 오류 원인과 해결 방법
    • [JAVA] Mac M1, M2 openjdk17 설치하기
    zoodi
    zoodi
    IT/개발 관련 지식을 기록하는 블로그입니다.
    • zoodi
      오늘의 기록
      zoodi
    • 전체
      오늘
      어제
      • 분류 전체보기
        • 후기
          • 컨퍼런스
          • 일상리뷰
        • 금융경제
          • 뉴스
          • 금융IT용어
          • 경제 및 부동산
        • 코딩 테스트
        • 스터디
          • JAVA
          • Kotlin
          • Spring
          • React, Nextjs
          • 인공지능 AI
          • Cloud & k8s
          • Kafka
          • Database
          • Network
          • Algorithm
          • Hadoop
          • LINUX
          • R Programming
          • 기타 (소공, 보안)
        • 도서
        • 기타
    • 블로그 메뉴

      • 홈
      • 스터디
      • 금융경제
      • 후기
      • 기타
    • 링크

    • 공지사항

    • 인기 글

    • 태그

      스프링
      kafka
      알고리즘
      자바
      C++
      스프링부트
      코테
      pythoncodingtest
      codility
      카카오코테
      MySQL
      LeetCode
      CodingTest
      Kotlin
      리트코드
      코테공부
      db
      쿠버네티스
      금융용어
      코딜리티
      자료구조
      java
      springboot
      코딩
      코딩테스트
      네트워크
      Python
      Spring
      프로그래머스
      이분탐색
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.4
    zoodi
    [JAVA] enum 비교는 equals 일까 == 일까?
    상단으로

    티스토리툴바