티스토리 뷰

JAVA

자바 습관(올바른 문자열 처리)

김남김 2023. 11. 29. 00:19

 

소프트웨어 개발에서 가장 자주 사용하면서 빈번히 문제를 일으키는 요소 중 하나가 바로 문자열이다.

이번에는 자바를 다시 공부하면서 StringBuilder 올바른 문자열 처리에 대해 공부해고자한다. 

 

1. 중복된 문자열은 삭제한다.

보통 사용자와 관련된 로그인, 회원가입, 로그아웃등의 기능은 유기적으로 연결되어있데 유형 정보를 각 메서드마다 문자열로 관리한다면 이를 추가하거나 수정하는데 단순한 실수로도 오류가 생길 수 있다. 

이를 위해서는 상수를 통해 중복된 문자열이 있다면 중복된 문자열을 없애준다. 

public class DuplicateCheck {

//...

	private static String ROLE_ADMIN = "R01";
    private static String ROLE_USER = "R02"; 
    
    public String getRoleName(String role) {
    	if (ROLE_ADMIN.equals(role)) {
        	return "관리자";
       }
       // ... 
    }
}

 

 

2. 올바른 문자열 객체 사용법 

String 값을 사용할 때 불필요하게 인스턴스를 생성하거나 toString메서드 호출, valueOf 메서드 호출을 사용할 때가 있다. 

문자열은 박스화 기본 자료형이기 때문에 객체를 생성할 때 굳이 new를 사용할 필요없이 따옴표를 통해 생성할 수 있다. 

String s = "안녕 나는 김남김!";

 

 

3. 대소문자를 포함한 문자열 비교법

대소문자가 혼합된 문자를 단순히 서로간에 스펠링만을 같은지 확인할 때가 있다. 보통 두 개에 toUpeerCase, toLowerCase를 사용하지만 해당 메서드는 임시 인스턴스를 생성하여 메모리 낭비를 발생시킨다. 

그렇기 때문에 두 문자열을 대소문자 구분없이 동일한지 비교한다면 String의 equalsIgnoreCase를 활용한다. 

String case = "aAssDa";
String upperCase = "AASSDA";
case.equalsIgnoreCase(upperCase); // true

 

 

4. 올바른 StringBuffer/ StringBuilder 생성자 사용

StringBuffer와 StringBuilder는 다양한 형태의 생성자를 제공하지만 인스턴스를 초기화할 떄 잘못된 길이를 설정하거나, char 형의 인자를 사용하는 경우가 있다. 이는 개발자가 정말 제대로 알고 사용하지 않는다면 원래 목적에 부합하지 않게 출력할 수 있다. 그렇기에 충분한 길이만큼 설정하거나, char가 아닌 문자열을 초기화하는 방식으로 사용한다. 

StringBuilder sb = new StringBuilder("A");
StringBuffer sb = new StringBuffer(100);

 

 

5. StringBuffer/ StringBuilder 사용시 주의해야하는 실수

대표적으로 문자열의 길이를 측정할 때, toString으로 생성하거나 append 메서드를 연결 호출하는 것이 있다. 

문자열의 길이는 length()가 있다. 그리고 append메서드 연결 호출은 이 메서드에 사용된 모든 인자도 연결되므로 비효율적인 메모리 점유가 발생하며, 성능상 그리 좋은 방식이 아니다.

물론 메서드 체인은 빌더페턴에서 사용되는 것과 같이 가독성과 사용성을 향상시킬 수 있지만, 결국 모든 메서드의 스택이 종료되기 전까지 점유한 메모리를 반환하지 않으며 메서드에 전달된 인자 또한 종료전까지 메모리 상에 유지된다. 

StringBuilder sb = new StringBuilder("안녕 나는 김남김");
sb.length(); // 9
sb.append("a");
sb.append("b");

 

 

 

 

 

6. 문자열에서 특정 문자 찾기

보통 문자열에서 특정 문자를 찾을 때, indexOf를 사용한다. 그러나 java.lang.String 소스코드를 확인해보면 char와 String에 대해 별도의 메서드를 제공하며 그에 따른 처리 절차 또한 각각 최적화되어 구현되어 있다. 한 글자로 구성되는char자료형을 String 형 인자로 전달하면 char 자료형에 대한 메서드가 아닌 String 자료형에 대한 메서드가 실행되어 비효율적인 연산이 이뤄진다. 

indexOf를 사용하게되면 따움표와 큰 따옴표를 잘 구분하여 사용하도록 한다. 

str.indexOf("abc");
str.indexOf('a');

 

 

7. 빈 문자열 확인

빈 문자열을 확인할 때 가장 많이 사용하는 방식은 trim 메서드다. 이를 통해 length 메서드로 길이가 0인지 확인하는 경우가 있는데 이는 새로운 인스턴스를 생성하기 떄문에 오로지 (' ')만을 비교하며 공백으로 간주될 수 있는 다른 특수문자는 확인하지 않는다.  Character 클래스의 isWhiteSpace 메서드를 통해 문자 단위로 명확하게 공백문자인지 판단하도록 한다. 

String emptyString = " ";
if (isEmpty(emptyString)) {
	System.out.println("비어있다.");
}

boolean isEmpty(String s) {
	int strlen;
    boolean result = true;
    if (str == null || str.length() == 0) {
    	result = true;
    }
    else {
    strLen = str.length();
    for (int i = 0; i < strLen; i++) {
    	if (!Character.isWhitespace(str.charAt(i))) {
        	result = false;
            break;
        }
    return result;
    }
}

 

 

8. 문자열의 시작 문자를 검사할 때는 startWith가 아닌 cahrAt을 활용하자. (indexOf, startsWith, charAt)

startWith과 indexOf에 대해 모두 접두사를 비교할 경우 비교적 startWith 이 더 빠른 방법이다. 

그러나 접두사가 단 한글자로 구성된 문자라면 startWith 보다는 해당 위치의 문자를 찾는 charAt을 활용하는 편이 더욱 더 빠른 방법이다.  각 메서드가 어디서 좋은 성능을 가질지에 대해서는 메서드에 대한 이해가 필요하다. 

String strIndexOf = "0000UPD0000";
String strStartsWith = "UPD0000000";
String strCharAt = "U00000001";

//indexOf 메서드는 문자열 중 불특정 위치의 문자열을 찾을 때 유용하다.
strIndexOf.indexOf.("UPD");

//startWith 메서드는 문자열의 접두사가 되는 문자열을 찾을 때 유용하다. 
strStartsWith.startsWith("UPD");

// charAt 메서드는 문자열에서 한 글자만 가져오기 때문에 문자열의 첫 문자를 찾을 때 유용하다.
strCharAt.charAt('U');

 

'JAVA' 카테고리의 다른 글

모든 객체의 공통 메서드  (1) 2023.12.02
객체의 생성과 파괴  (2) 2023.12.02
자바 습관 (기본 프로그래밍)  (0) 2023.11.28
어떻게 협력하는가? (with MVC)  (0) 2023.10.14
Java 코딩 컨벤션  (1) 2023.10.13
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
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
글 보관함