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] 타임존 알아보기 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] Fail-Fast 와 Fail-Safe (0) | 2023.08.17 |
댓글