본문 바로가기
Java

객체 비교

by lms0806 2024. 4. 2.
728x90
반응형

자바에는 다양한 비교 라이브러리들이 존재합니다.

 

그 중, 객체(문자열) 비교 함수로 equals를 주로 사용합니다.

그러면서 만나는 불편한점 해소 및 잘못사용하고 있었던 방식에 대해 이야기해보고자 합니다.

 

불편한 점

문자열 비교를 위하여 equals를 사용하다보면, 대문자와 소문자 구별을 못하는 경우가 발생합니다.

String s = "abc";
System.out.print(s.equals("ABC"));

false
String s = "ABC";
System.out.print(s.equals("abc"));

false

이럴 경우 보통 저희는 이런식으로 대처합니다.

 

소문자로 비교하면 비교 대상을 소문자로, 대문자로 비교하면 비교 대상을 대문자로 변경 후 비교하게 됩니다.

String s = "ABC";

System.out.print(s.toLowerCase().equals("abc"));

true

이럴 경우, toLowerCase()나 toUpperCase()로 로직을 한 번 더 거치고 equals 비교를 진행하게 됩니다.

 

자바에는 대소문자 변경을 거치지 않고, 비교를 하는 equalsIgnoreCase라는 함수가 존재합니다.

String s = "ABC";

System.out.print(s.equalsIgnoreCase("abc"));

true

해당 함수를 사용하게 되면, 비교 대상이 대문자인지, 소문자인지 상관 없이 비교를 진행하게 됩니다.

 

equals와 equalsIgnoreCase와 비슷하게 compareTo와 compareToIgnoreCase도 비슷하게 사용됩니다.

String s = "ABC";
		
System.out.println(s.compareTo("abc"));
System.out.print(s.compareToIgnoreCase("abc"));

-32
0

해당 함수는 0인 경우 두 문자열이 같다는 것을 의미합니다.

 

잘못 사용하고 있던 방식

String s = "1";
		
System.out.print(s.equals("1"));

기존에 객체(문자열) 비교를 진행하게 되면, 이런 형식으로 주로 사용을 할 것입니다.

여기서 치명적인 문제점이 발생하게 됩니다.

문자열 s가 만약 null이라면 어떻게 될까요?

 

String s = null;

System.out.print(s.equals("1"));

s가 null이라 에러를 발생하게 됩니다.

그러면 이런식으로 바꾸면 어떻게 될까요?

String s = null;
		
System.out.print("1".equals(s));

해당 방식은 에러를 발생하지 않고, false를 반환하게 됩니다.

 

여기서 중요하게 봐야할 점은 정확하게 값이 존재한다고 확정할 수 있는 변수의 위치 입니다.

String s의 경우 null이 될 수 있지만, "1"와 같은 문자열의 경우 특정 값을 확실하게 가지고 있기 때문에, null로 인한 에러가 발생할 수 없습니다.

728x90
반응형

댓글