문자열(String)은 텍스트를 표현하도록 설계되었지만 원래 의도하지 않은 용도로도 쓰이는 경향이 있다.
이번 아이템에서는 문자열을 쓰지 않아야 할 사례를 다룬다.
문자열을 쓰지 않아야 할 사례
1. 문자열은 다른 값 타입을 대신하기에 적합하지 않다.
- 입력받을 데이터가 진짜 문자열이 아닌 수치형이라면 int, float, BigInteger 등 적당한 수치 타입으로 변환해야 한다.
- 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고 없다면 새로 작성하자.
2. 문자열은 열거 타입을 대신하기에 적합하지 않다.
- 상수를 열거할 떄는 문자열보다는 열거 타입이 월등히 낫다.
3. 문자열은 혼합 타입을 대신하기에 적합하지 않다.
- 여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 대체로 좋지 않은 생각이다.
ex) String compoundKey = className + "#" + i.next();
- 두 요소를 구분해주는 문자 #이 두 요소 중 하나에서 쓰였다면 구분할 수 없다.
- 각 요소를 개별로 접근하려면 문자열을 파싱해야 해서 느리고, 귀찮고, 오류 가능성도 커진다.
- equals, toString, compareTo 메서드를 사용할 수 없으며, String이 제공하는 기능에만 의존해야 한다.
- 따라서 새로 private 정적 멤버 클래스를 만드는 것이 좋다.
4. 문자열은 권한을 표현하기에 적합하지 않다.
권한을 문자열로 표현해서 클라이언트가 제공한 문자열 키로 스레드별 지역변수를 식별
public class ThreadLocal{
private ThreadLocal() {}
//현 스레드의 값을 키로 구분해 저장한다.
public static void set(String key, Object value);
// 키가 가리키는 현 스레드의 값을 반환한다.
public static Object get(String key);
}
- 스레드 구분용 문자열 키는 전역 이름공간에서 공유된다. (문자열은 어떤 스레드든 접근할 수 있으며, 스레드 간에 공유될 수 있다.)
- 이 방식이 의도대로 동작하려면 각 클라이언트가 고유한 키를 제공해야 하는데, 만약 두 클라이언트가 서로 소통하지 못해 같은 키를 쓰기로 결정한다면, 의도치 않게 같은 변수를 공유하게 된다.
결론
- 더 적합한 데이터 타입이 있거나 새로 작성할 수 있다면, 문자열을 쓰지 말자.
- 문자열은 잘못 사용하면 번거롭고, 덜 유연하고, 느리고, 오류 가능성도 크다.
- 문자열을 잘못 사용한 예로는 기본 타입, 열거 타입, 혼합 타입이 있다.
'Java > Effective Java' 카테고리의 다른 글
[Effective Java] Item 64. 객체는 인터페이스를 사용해 참조하라 (0) | 2023.07.30 |
---|---|
[Effective Java] Item 63. 문자열 연결은 느리니 주의하라 (0) | 2023.07.30 |
[Effective Java] Item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 (0) | 2023.07.30 |
[Effective Java] Item 60. 정확한 답이 필요하다면 float와 double은 피하라 (0) | 2023.07.23 |
[Effective Java] Item 59. 라이브러리를 익히고 사용하라 (0) | 2023.07.23 |