상세 컨텐츠

본문 제목

[Java- Enum] (Enum or 상수) NullPointerException 방지하기

Programming language/자바

by choiDev 2022. 8. 14. 18:17

본문

현업에서 Enum을 사용하다가 NullPointerException에 취약하게  Enum을 사용했던
과거의 저와 몇몇 신입 동료들을 기억하며 기록하려고 글을 작성해 봅니다.

[Enum or 상수와 객체(값)을 비교할때 Null을 조심하자]

//"Enum일때 문제가 되는 코드"

public enum DeviceType {
    Android,
    IOS
}

public static boolean isAndroid(DeviceType userDeviceType){
    return userDeviceType.equals(DeviceType.Android)
}


//"상수일때 문제가 되는 코드"

public static String DEVICE_TYPE_ANDROID = "Android";
public static String DEVICE_TYPE_IOS = "IOS";

public static boolean isAndroid(String userDeviceType){
    return userDeviceType.equals(DEVICE_TYPE_ANDROID)
}

위에 코드에서문제가 되는 부분은 어디인지 한번 고민해보고 가시면 좋을것 같아 아래에는 공백을 넣어두었습니다.

.

.

.

.

.

 

[코드 해설]

위에서 본 코드들의 문제는 userDeviceType이라는 변수가 null인경우에 equals를 사용하면 NullPointerException 발생합니다.

변수에 값이 존재했다면 Enum or String이 기본적으로 가지고 있는 equals 메소드를 사용해서 비교를 시작하지만

변수가 null이면 null은 equals메소드를 가지고있지 않기에 NullPointerException을 발생하게 됩니다.

 

[Enum or 상수의 안전한 사용방법]

/** 
 * Enum의 해결 방식은 아래 두가지로 나뉩니다.
 * 1. 변수의 equals 아닌 이미 초기화가 되어있는 Enum타입의 equals을 사용합니다.
 * 2. == 연산자로 비교를 합니다.
 */
 
public enum DeviceType {
    Android,
    IOS
}

/** 
 * DeviceType.Android는 이미 메모리에 초기화 되어있어서 null이 아니며 equals메소드는 
 * null이 들어와도 Null Safety한 메소드이기에 NullPointerException이 발생하지 않는다.
 */
public static boolean isAndroid(DeviceType userDeviceType){
    return DeviceType.Android.equals(userDeviceType)

}

/**
 * 단순히 null == DeviceType.IOS 이여서 null정의 되어있지 않은 equals을 사용하는 실수도 없고
 * 값끼리의 비교를 합니다.
 */
public static boolean isIOS(DeviceType userDeviceType){
    return userDeviceType == DeviceType.IOS
}

 

 

정말 단순히 위와같이 DeviceType.IOS 가 앞에 와서 equals하는 것 만으로 NullPoiunterException을 방지하는것을 보았을때

쉬운데 이걸 왜 실수하지 라고 생각 하는 분들도 계셨는데,

개인적인 생각으로 현업이 항상 집중이 가능하고, 항상 나에겐 느긋한 시간이 주어져 있는 것이 아니여서

빠른 개발을 하려다가 이런 부분을 놓치는 경우를 많이 보았습니다.

 

나의 코드 작성 습관과 린트 룰 적용으로 인한 실수 방지, 이런식으로 조금씩 문제를 해결하고 팀에 기여하는 개발자가 되기 위해 기록을 남겨봅니다.

 

감사합니다 :)

관련글 더보기