🚀 from error to study/Java

[Java] NullPointerException을 방지하는 Objects.equals 메서드

천재강쥐 2024. 11. 7. 11:20

 

 

 

🔥 포스팅 계기

Java 로직을 구현하다 보면 NullPointerException을 자주 볼 수 있습니다

애초에 문자를 넣고 초기화할 수도 있겠지만 쿼리에서 param != null 같은 옵션을 사용할 수도 있고
운영 단계에서는 이미 만들어진 데이터를 가공해서 써야 하기 때문에 매번 null 체크를 해야 하는 번거로움이 있었습니다.
그런데

 

 

귤에 붙어 있는 하얀 거 이름은.. 아니아니

Null 체크가 필요 없는 equals()가 있다면 어떨까요?

 

 

 

 

📍 equals()와 Objects.equlas()의 차이

👉🏻 문자열을 비교할 때 사용하는 equals()
👉🏻 하지만 아래 예시처럼 a가 null일 경우, 에러가 발생하기 때문에 equals()를 사용할 때는 null 예외 처리가 필요함

public class Equals {
	public static void main(String[] args) {
    	String a = null;
        String b = "aa";
        System.out.println(a.equals(b)); // NullPointException 발생!
    }
}

 

👉🏻 어려운 부분은 아니지만 이 부분이 생각보다 코드가 번잡해 보이고 까먹을 우려도 있음

public class Equals {
	public static void main(String[] args) {
    	String a = null;
        String b = "aa";
        
        if(aa != null && aa.equals(bb)) {
        	System.out.println("a equal to b");
        }
    }
}

 

👉🏻 Objects.equlas()는 null 에러 없이 null과 문자열 비교가 가능해짐

public class Equals {
	public static void main(String[] args) {
    	String a = null;
        String b = null;
        String c = "attn";
        String d = "attn";
        
        System.out.println(Objects.equals(a, b)); // true
        System.out.println(Objects.equals(c, d)); // true
        System.out.println(Objects.equals(a, c)); // false
    }
}

 

👉🏻 참고로 해당 함수는 자바 8부터 등장함

//Objects.equals()
public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

 

📍 Objects.equals()의 사용

👉🏻 equlas()를 사용했을 때 오류 발생하는 코드

/** equals(), Object.equlas()의 차이 확인 */
AtnBasicsConfigVO test1 = new AtnBasicsConfigVO();
AtnBasicsConfigVO test2 = new AtnBasicsConfigVO();

test1.setAplyBgnDe(null);
test2.setAplyBgnDe("20241107");

try {
    if(test1.getAplyBgnDe().equals(test2.getAplyBgnDe())){
        System.out.println("test1, test2 일치함");
    } else {
        System.out.println("test1, test2 일치하지 않음");
    }
} catch(Exception e) {
    System.out.println("equlas 비교 중 에러 발생!");
    e.printStackTrace();
}

자비도 없이 NullPointerExcpeion을 던져 버리는 모습

 

👉🏻 Objects.equals를 사용하면 어떻게 바뀔까?

/** equals(), Object.equlas()의 차이 확인 */
AtnBasicsConfigVO test1 = new AtnBasicsConfigVO();
AtnBasicsConfigVO test2 = new AtnBasicsConfigVO();

test1.setAplyBgnDe("20241107");
test2.setAplyBgnDe(null);

try {
    if(Objects.equals(test1.getAplyBgnDe(), test2.getAplyBgnDe())){
        System.out.println("test1, test2 일치함");
    } else {
        System.out.println("test1, test2 일치하지 않음");
    }
} catch(Exception e) {
    System.out.println("equlas 비교 중 에러 발생!");
    e.printStackTrace();
}

 

동일한 null 데이터를 비교했음에도 오류가 아닌 else 문에 잡히는 디버깅
동일한 데이터를 넣었을 때 일치 비교도 확인

 

a, b 두 개의 파라미터 값을 바꿔 봐도 정상 동작 확인

 

 

 

👉🏻 아주 유용하게 쓸 수 있을 듯하다 (づ ̄ 3 ̄)づ

더보기