티스토리 뷰

자바의 String은 텍스트를 표현하고자 설계했고 아주 잘 작동한다.

근데 너무 잘 지원해주다보니 의도하지 않은 용도로 쓰이는 경향이 있다.

문자열은 입력받을 데이터가 "진짜 문자열" 일 때만 사용하는게 좋다.

 

문자열을 쓰지말아야 할 사례에 대하여 알아보자.

수치형이라면 int, float, BigInteger 등 적당한 수치타입으로 변환해야 한다.

예/아니오 의 답이라면 적절한 열거 타입이나 boolean 으로 변환해야 한다.

일반화 하자면, 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 만들어서 사용하라.

 

문자열은 열거 타입을 대신하기에 적합하지 않다.

앞에서 다뤘듯 (Item34) 상수를 열거할 때는 문자열보다는 열거타입을 사용하자.

 

문자열은 혼합 타입을 대신하기에 적합하지 않다.

여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 대체로 좋지 않다.

// 62-1. 부적절한 예
String compoundKey = className + "#" + i.next();

두 요소를 구분하는 #가 두 요소 중 하나에 쓰였다면 혼란스러울 수 있다.

개별로 접근하려면 문자열 파싱해야 해서 느리고, 귀찮고, 오류 가능성도 커진다.

적절한 Objects 클래스 메서드를 제공할 수 없으며, String 클래스의 기능에만 의존해야 한다.

이럴 경우 차라리 전용 클래스를 만들자.

 

문자열은 권한을 표현하기에 적합하지 않다.

// BAD - 문자열을 사용해 권한을 구분한다.
public class ThreadLocal {
  private ThreadLocal() {...}
  public static void set(String key, Object value) {...}
  public static Object get(String key) {...}
}

// GOOD - 위조할 수 없는 Key를 구현
public final class ThreadLocal<T> {
  public ThreadLocal() {...}
  public void set(T value) {...}
  public T get() {...}
}

이 방식의 문제는 문자열 키가 전역 이름공간에서 공유된다는 점이다.

의도대로 동작하려면 각 클라이언트가 고유한 키를 제공해야 하는데 만약 같은 키를 쓰기로 한다면 의도치 않게 같은 변수를 공유하게 된다. 결국 에러가 발생할 것이다. 보안도 취약하다.

이 문제는 문자열 대신 위조할 수 없는 키를 사용하면 해결된다. 이 키를 권한 (capacity) 라고 한다.

결론

  • 적합한 데이터 타입이 있거나 새로 작성할 수 있다면, 문자열을 쓰지 말자.
  • 문자열을 잘못 사용하면 번거롭고, 덜 유연하고, 느리고, 오류 가능성이 크다.
  • 잘못 사용하는 예로는 기본타입, 열거타입, 혼합타입이 있다.