시소당
오늘 어떤 문서를 보다 "아직도 Java에서 이런 방식으로 문자열 비교를 하는 사람이 있구나..." 라는 생각을 하게
되었습니다. 문서를 만들 만큼이면 어느정도 아는 사람일텐데요... 문자열 비교하는데 쉽게 빠지는 함정에 빠진 적이 없어서 인지도
모르겠고요... 물론 저도 개발 경험은 없습니다...^^ 그래서 Java에서 문자열 비교할 때 쉽게 빠질 수 있는 함정에 대해
떠들어 보겠습니다.
Java 코드를 보다 보면 다음과 같이 문자열 비교를 하는 경우를 종종 봅니다. 저 역시도 처음에는 그런 방식으로 문자열을 비교했었습니다. 그게 사람의 생각을 바로 표현하는 방법이니까요... 다음 예를 봅시다.
public void compareType(Stirng type)
{
if(type.equals("AAA"))
...
else if(type.equals("BBB"))
...
else if(type.equals("CCC"))
...
}
이것이 사람의 생각을 바로 코드로 적은 것입니다. type이 "AAA"이면 XXX하고, type이 "BBB"이면 XXX하고, type이 "CCC"이면 XXX하고... 하지만 여기서 중요한 문제 하나를 잊고 지나가고 있습니다.
만일 메소드를 호출할 때 전달인자로 null값을 주었다면 어떻게 될까요??
명시적으로 compareType(null)이라고 호출하는 경우가 아니더라도, compareType(carType)이라고 호출을
했는데 carType을 초기화 하지 않았다거나 하는 이유로 type이 null인 경우도 있을 수 있습니다. Java에서 문자열을
String 클래스의 객체로 만들어지기 때문에 equals라는 메소드를 사용할 수 있는 것입니다. 하지만 메소드의 전달인자가
null이고, 그래서 type 변수가 null인 상태에서 메소드를 실행하면
NullPointerException을 던지게 됩니다.
메
소드를 아무리 정교하게 잘 만들었다고 해도, 메소드 처음에 전달인자가 null인지 체크하지 않는다면 메소드를 호출하는 곳에서
전달 인자로 null을 보내는 등의 실수를 범하게 되면 평소에 잘 작동하던 코드가 문제가 생길 수 있습니다. 이런 경우 아래와
같이 바꾸어야 합니다.
public void compareType(Stirng type)
{
if("AAA".equals(type))
...
else if("BBB".equals(type))
...
else if("CCC".equals(type))
...
}
Java
는 문자열을 모두 String 클래스의 객체로 인식합니다. "AAA", "BBB", "CCC" 모두 문자열이고 String
클래스의 객체입니다. 그러므로 equals 메소드를 가지고 있어서 위와 같은 코드는 별 문제 없이 동작을 하고, 메소드
전달인자로 null을 넣는 실수를 범해도 NullPointerException과 같은 문제는 발생하지 않습니다.
Java는 문자열을 String 클래스 객체로 인식을 하기 때문에 String 클래스의 메소드를 사용할 때는 문자열이 null이 아닌지 주의하여야 합니다.이와 비슷하게 C나 C++에서는 비교문을 다음과 같이 사용하지 않습니다.
int type = ...;
if(type == 1)
...
else if(type == 2)
...
위와 같이 사용을 할 때 '=='을 실수로 '='로 입력하는 경우가 종종 발생하기 때문에 아래와 같이 사용을 합니다.
int type = ...;
if(1 == type)
...
else if(2 == type)
...
'=='을 '='로 잘못 입력을 하게 되면, 다음과 같은 이유로 문제가 발생합니다. C나 C++은 '0'만이 거짓이고, '0'이 아닌 모든 값을 참으로 판별을 합니다. 그리고
연쇄적 연산을
하기 위해 대부분의 연산이나 대입이 끝난 후 그 값을 리턴하기 때문에 "type == 2"를 "type = 2"로 입력하는 경우
type값이 변할뿐더러 대입된 값이 리턴되어 조건문도 잘못됩니다. 그래서 "type == 2"를 "2 == type"으로 쓰라고
권고를 합니다.
+ 정리를 하기 위해 포스팅을 하기 시작했는데 정리는 안돼고 더 복잡해지는 것 같은게...=_=a
출처 : http://entireboy.egloos.com/2411775