TL;DR;
무적권 .eqauls() 대신 ==을 써라.
Pizza.java
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Pizza {
// == 을 쓰면 좋은 이유
// getStatus() 랑 PizzaStatus 값(평가값)이 실제로 같다 하더라도 타입은 다르기 때문에
// compile error 가 발생해야한다.
// 이를 피하기위해 .equals() 대신 == 을 쓴다.
// Q. enum 에 string 값을 삽입할 수 있는가?
private PizzaStatus status;
private PizzaColor color;
public enum PizzaColor {
GREEN,
RED,
BLUE
}
public enum PizzaStatus {
ORDERED,
READY,
DELIVERED;
}
}
PizzaTest.java
멤버변수로 enum 타입을 가진 경우 nullable 하기 때문에 `equals()` 사용시
NullPointerException 이 발생할 수 있다.
'==' 는 NullPointerException 발생 없이 null 과 PizzaStatus.DELIVERED 를 비교하는 것을 볼 수 있는데
이는 Enum 타입이 JVM 메모리에 유일하게 하나만 상주하기 때문이다. == 같은 값은 무조건 참조 메모리 주소값이 같다.
public class PizzaTest {
@Test
@DisplayName("Enum 비교는 equals 보다 '==' 이 낫다 국룰인이유 - Runtime")
void runtimeSafety() {
Pizza pizza = new Pizza();
if (pizza.getStatus().equals(pizza.getStatus()));
// Use '==' instead of equals (to compare enum class)
if (pizza.getStatus() != Pizza.PizzaStatus.DELIVERED) System.out.println("이게 null check 가 되야함.");;
}
@DisplayName("Enum 비교는 equals 보다 '==' 이 낫다 국룰인이유 - CompileTime")
@Test
void compileSafetyCheck() {
Pizza pizza = new Pizza(Pizza.PizzaStatus.DELIVERED, null);
if(!pizza.getStatus().equals(Pizza.PizzaColor.GREEN)) System.out.println("여기가 구조적으로 도달해선 안됨.");
if(pizza.getStatus() == Pizza.PizzaColor.GREEN) System.out.println("애초에 컴파일 에러가남.");
}
}
Compile time 에도 위 예제에서
PizzaStatus 타입과 PizzaColor 타입을 `equals()` 로 비교하는 것을 볼 수 있는데
사실 서로 다른 타입을 비교하는 것이므로 컴파일 타임에 에러가 발생하는게 옳은 동작이다.
(다시 말하지만 enum 타입은 JVM 메모리상에 유일하게 하나만 상주하기 때문에 타입이 다른데 비교를 하는 것 자체가 어불성설이다.)
References
https://www.baeldung.com/a-guide-to-java-enums
'JVM > Java' 카테고리의 다른 글
[Java] Generic vs WildCard (2) | 2024.01.07 |
---|---|
[객체지향] 잘못된 DRY 원칙 적용 (0) | 2023.12.16 |
[Java & Kotlin] Stream (1) | 2023.10.09 |
[Java] SpringBoot 없이 Yaml config 로드하기 (feat.SnakeYaml) (0) | 2023.09.15 |
Presentation - Business DTO를 분리시켜라 (0) | 2023.08.06 |