맞는데 왜 틀릴까..?

Java/Effective Java

[Effective Java] Item 62. 다른 타입이 적절하다면 문자열 사용을 피하라

안도일 2023. 7. 30. 15:50

문자열(String)은 텍스트를 표현하도록 설계되었지만 원래 의도하지 않은 용도로도 쓰이는 경향이 있다.

이번 아이템에서는 문자열을 쓰지 않아야 할 사례를 다룬다.

 

문자열을 쓰지 않아야 할 사례

 

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

 

  • 입력받을 데이터가 진짜 문자열이 아닌 수치형이라면  int, float, BigInteger 등 적당한 수치 타입으로 변환해야 한다.
  • 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고 없다면 새로 작성하자.

 

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

 

  • 상수를 열거할 떄는 문자열보다는 열거 타입이 월등히 낫다.

 

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

 

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

 

ex) String compoundKey = className + "#" + i.next();

 

  1. 두 요소를 구분해주는 문자 #이 두 요소 중 하나에서 쓰였다면 구분할 수 없다.
  2. 각 요소를 개별로 접근하려면 문자열을 파싱해야 해서 느리고, 귀찮고, 오류 가능성도 커진다.
  3. equals, toString, compareTo 메서드를 사용할 수 없으며, String이 제공하는 기능에만 의존해야 한다.
  4. 따라서 새로 private 정적 멤버 클래스를 만드는 것이 좋다.

 

 

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

 

권한을 문자열로 표현해서 클라이언트가 제공한 문자열 키로 스레드별 지역변수를 식별

 

public class ThreadLocal{

	private ThreadLocal() {}
    
    //현 스레드의 값을 키로 구분해 저장한다.
    public static void set(String key, Object value);
    
    // 키가 가리키는 현 스레드의 값을 반환한다.
    public static Object get(String key);
}

 

 

  • 스레드 구분용 문자열 키는 전역 이름공간에서 공유된다. (문자열은 어떤 스레드든 접근할 수 있으며, 스레드 간에 공유될 수 있다.)
  • 이 방식이 의도대로 동작하려면 각 클라이언트가 고유한 키를 제공해야 하는데, 만약 두 클라이언트가 서로 소통하지 못해 같은 키를 쓰기로 결정한다면, 의도치 않게 같은 변수를 공유하게 된다.

 

 

 

결론

 

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