[Java] Item 62 : 다른 타입이 적절하다면 문자열 사용을 피하라
Effective Java를 읽고 정리한 정리본입니다.
📌 Item 62 : 다른 타입이 적절하다면 문자열 사용을 피하라
🫧 1. 문자열은 다른 값 타입을 대신하기에 적합하지 않다.
많은 사람이 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 사용하지만, 입력 받을 데이터가 진짜 문자열일 때만 그렇게 하는 것이 좋다.
- 받은 데이터가 수치형이라면 int, float, BigInteger 등 적당한 수치 타입으로 변환
- ‘예/아니오’ 질문의 다입이라면 적절한 열거 타입 혹은 boolean으로 벼환
🫧 2. 문자열은 열거 타입을 대신하기에 적합하지 않다.
🫧 3. 문자열은 혼합 타입을 대신하기에 적합하지 않다.
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);
}
각 클라이언트가 고유한 키를 제공해야 하지만, 만일 소통 오류로 인해 같은 키를 쓰기로 결정했다면 문제가 발생하게 될 것이다.
✨ 해결법
이 API는 문자열 대신 위조할 수 없는 키를 사용하면 쉽게 해결될 수 있다.
이 키를 권한이라고 한다.
public final class ThreadLocal<T> {
public ThreadLocal();
public void set(T value);
public T get();
}