본문 바로가기
기술 정리/클린코드

Java enum 비교시 == 또는 equals() 어떤게 좋을까?

by 뿌랭랭 2023. 2. 28.

우선 enum의 경우 둘 다 정확하고 옳습니다!! 팀 컨벤션을 따르길!

== 는 NullPointerException 을 절대 던지지 않는다 

enum Color { BLACK, WHITE };

Color nothing = null;
if (nothing == Color.BLACK);      // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException

==는 컴파일 타임에 type 검사를 합니다.

enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };

if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT);      // DOESN'T COMPILE!!! Incompatible types!

요약하면  == .

  • 두 개의 열거형 값을 비교하는 데 사용하는 == 것은 각 열거형 상수에 대해 하나의 개체만 있기 때문에 작동합니다. (싱글톤)
  • 더 빠릅니다.
  • 런타임에 더 안전.
  • 컴파일 타임에 더 안전.

 

 

간단한 람다를 사용할 때는 메서드 참조를 사용할 수 있기 때문에 람다 equals보다 .== 를 선호합니다

다음 람다를 고려하십시오.

Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(e -> e == SomeEnum.B);
Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(e -> e.equals(SomeEnum.B));

나중에 다음으로 변환할 수 있습니다.

Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(SomeEnum.B::equals));

 

 

 

 

그런데 반대의견들도 많네요.

 

 

 

== 대신  equals를 사용하는 것을 선호하는 이유?

 

참고로, 다음과 같이 작성하는 경우 null-safe 코드를 작성하는 데 실제로 사용할 필요가 없습니다

public useEnums(final SomeEnum a) {
    if (SomeEnum.SOME_ENUM_VALUE.equals(a)) {
        …
    }
    …
}

 

 

인식하지 못한 채 버그를 도입할 수 있기 때문입니다. 

정확히 동일하지만 분리된 패키지에 있는 이 열거형이 있다고 가정합니다(일반적이지는 않지만 발생할 수 있음).

첫 번째 열거형 :

package first.pckg

public enum Category {
    JAZZ,
    ROCK,
    POP,
    POP_ROCK
}

두 번째 열거형:

package second.pckg

public enum Category {
    JAZZ,
    ROCK,
    POP,
    POP_ROCK
}

그런 다음 next와 같은 등호를 사용하지만 item.category인식 하지 못한 채

첫 번째 대신 first.pckg.Category 두 번째 second.pckg.Category enum( )을 가져왔다고 가정합니다.

import second.pckg.Category;
...

Category.JAZZ.equals(item.getCategory())

> 컴파일 오류 못잡아냄.

 

== 연산자를 대신 사용하면 컴파일 오류가 발생합니다.

import second.pckg.Category; 
...

Category.JAZZ == item.getCategory() 
 

 

 

 

또 다른 옵션은 유틸리티 방법입니다

Objects.equals( thisEnum , thatEnum )

 

Objects.equals널 안전을 위해

boolean areEqual = Objects.equals( Month.FEBRUARY , Month.JUNE ) ;  // Returns `false`.

이 방법에는 몇 가지 이점이 있습니다.

  • Null 안전
    • 둘 다 null ➙true
    • null ➙false
    • NullPointerException 던질 위험이 없습니다
  • 컴팩트, 가독성

작동 원리

OpenJDK  Java 10 소스 코드 에서 직접 확인하십시오 .

return 
    ( a == b ) 
    || 
    ( 
        a != null 
        && 
        a.equals( b )
    )
;
 

== 먼저 체크하고, equal도 체크하는군용

 

 

 

 

 

 

 

 

'기술 정리 > 클린코드' 카테고리의 다른 글

Exception과 RuntimeException 차이?  (0) 2023.04.19