[Effective Java] 문자열 String 영어 대소문자 무시하여 비교시에는 equalsIgnoreCase() 메서드를 사용하자
뭔가 포스팅 제목만 보자면 방문자분들께서 "뭘 이미 알고 있는 당연한 이야기를 하고 있어?" 라는 말이 나올것같은 제목입니다. 이 글은 equalsIgnoreCase() 메서드를 사용하면 어떤 장점이 있는지를 정리해보고자 한 글이니 읽기에 앞서 참고 부탁드립니다.




영어(알파벳)로만 이루어진 String 객체 대소문자 무시하여 비교하는 방법
만약 영문자 값으로만 이루어진 두 문자열 str1str2가 있다고 했을때 이 둘을 대소문자를 무시하고 단순히 알파벳이 같은지만 비교하고자 한다면 어떻게 해야할까요?

가장 쉬운 방법은 다음과 같이 str1str2를 각각 toUpperCase() 메서드나 toLowerCase()를 이용하여 대문자나 소문자로 모두 바꿔버린 후에 비교하는 것입니다.
String str1 = "Hello World";
String str2 = "hELLo wORLD";
 
String lowerStr1 = str1.toLowerCase(); //또는 toUpperCase() 
String lowerStr2 = str2.toLowerCase(); //또는 toUpperCase() 
 
boolean isSame = lowerStr1.equals(lowerStr2);
 
if(isSame) {
    System.out.println("두 문자열의 알파벳은 동일합니다.");
}else {
    System.out.println("두 문자열의 알파벳은 다릅니다.");
}
cs


 




toUpperCase() 또는 toLowerCase()의 문제점
사실 앞서 설명한 코드는 매우 잘 동작하는 코드입니다. 다만 굳이 문제점을 찾아내보자면 메모리 최적화 측면에서 약간의 문제점이 있습니다.

toUpperCase(), toLowerCase() 메서드는 내부 구현이 다음과 같은 방식으로 처리하도록 되어있습니다.
1. String 객체가 가지고 있는 문자열값 char형 배열을 같은 크기로 새로 생성한다.
2. 가지고 있던 문자열값을 새로 생성한 char형 배열에 복사한다.
3. 새로 생성한 문자타입 배열을 대/소문자로 모두 변경하여 String 객체에 담아 리턴한다.

위와 같은 이유로 두개의 메서드는 대/소문자로 변환할때마다 문자열 길이에 맞는 문자타입 배열을 새로 생성하므로 메모리상 낭비가 발생합니다.
두번째 단점으로는 불필요하게 코드를 여러단계에 걸쳐 비교해야 하기때문에 가독성면에서 좋지 못하다는 점입니다.




equalsIgnoreCase()메서드를 사용하자
만약 메모리 최적화를 할 필요가 있는 시스템이라면 toUpperCase()/toLowerCase() 대신에 equalsIgnoreCase(String target) 메서드를 사용하도록 합니다. equalsIgnoreCase() 메서드를 사용한 아래 코드는 앞서 작성한 코드와 동일한 기능을 수행하면서도 내부적으로는 문자타입 배열을 생성하지 않고 비교하므로 메모리 최적화측면에서도 장점이 있습니다. 또한 코드가 보기좋게 줄어들어 가독성 면에서도 상대적으로 좋습니다.
String str1 = "Hello World";
String str2 = "hELLo wORLD";
 
boolean isSame = str1.equalsIgnoreCase(str2);
 
if(isSame) {
    System.out.println("두 문자열의 알파벳은 동일합니다.");
}else {
    System.out.println("두 문자열의 알파벳은 다릅니다.");
}
cs


 
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!