JAVA String equals시 주의할점

Java에서 String equals 시 주의할점을 적어봅니다.

Null 참조를 주의합니다


일반적으로 사용하는방법, 변수를 먼저 쓴다.

변수.equals("상수")

  • 해당 방법은 변수가 null이 들어올 경우 예외를 발생시키게 되고, 비정상적인 프로그램 종료를 발생시킬 수 있다.
1
2
3
4
5
6
7
    public static void equalsTest1(String name) {
        if (name.equals("JYS")) {   // null exception!
            System.out.println("Hi YoonSung");
        } else {
            System.out.println("Who are you?");
        }
    }
1
2
3
Exception in thread "main" java.lang.NullPointerException
	at Practice.equalsTest1(Practice.java:6)
	at Practice.main(Practice.java:26)
  • null 이 들어올시, Who are you? 가 아닌 NullPointerException이 발생한다.

상수를 먼저 씀으로써 회피한다.

상수.equals("변수")

  • eqauls함수에서 null 체크를 먼저 해버리므로, 예외를 회피할 수 있다.
1
2
3
4
5
6
7
8
    public static void equalsTest2(String name) {
        //if (name.equals("JYS")) {
        if ("JYS".equals(name)) {   // null이 처리가 되어 else로 보낸다.
            System.out.println("Hi YoonSung");
        } else {
            System.out.println("Who are you?");
        }
    }

또 다른 방법 Object equals 이용.

Objects.equals("문자열1", "문자열2)

1
2
3
4
5
6
7
    public static void equalsTest3(String name) {
        if (Objects.equals(name, "JYS")) {
            System.out.println("Hi YoonSung");
        } else {
            System.out.println("Who are you?");
        }
    }
  • 다음과 같은 경우에 name에 null이 들어가도 null 참조 예외가 발생하지 않는다.
1
2
3
    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }
  • Objcets equals의 구현을 보면, null 체크를 해주기 떄문!

전체 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.Objects;

class Practice {
    public static void equalsTest1(String name) {
        try {
            if (name.equals("JYS")) {
                System.out.println("Hi YoonSung");
            } else {
                System.out.println("Who are you?");
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public static void equalsTest2(String name) {
        if ("JYS".equals(name)) {
            System.out.println("Hi YoonSung");
        } else {
            System.out.println("Who are you?");
        }
    }

    public static void equalsTest3(String name) {
        if (Objects.equals(name, "JYS")) {
            System.out.println("Hi YoonSung");
        } else {
            System.out.println("Who are you?");
        }
    }
    public static void main(String[] args) {
        String name = "JYS";
        String nullName = null;

        equalsTest1(name);
        equalsTest1(nullName);

        equalsTest2(name);
        equalsTest2(nullName);

        equalsTest3(name);
        equalsTest3(nullName);
    }
}
1
2
3
4
5
6
Hi YoonSung
null
Hi YoonSung
Who are you?
Hi YoonSung
Who are you?
  • 아주 사소한 차이지만, 결과는 사소하지 않을 수 있다.
  • 방어적인 코딩을 하는 습관을 몸에 배여놓자.