아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라

Mando·2023년 11월 21일
0

이펙티브 자바

목록 보기
1/10
post-thumbnail

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

  • 입력받을 테이터가 진짜 문자열일 때만 문자열을 사용하자.
    받은 데이터가 수치형이라면 int, float, BigInteger 등 적당한 수치 타입으로 변환 해야 한다.
  • 예/아니요 질문의 답이라면 열거형 타입이나 boolean으로 변환해야 한다.

기본타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성하라

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

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

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

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

이때는 String이 제공하는 기능에만 의존해야 한다.
그래서 차라리 새로운 전용 클래스를 만드는 게 낫다.
이런 클래스는 보통 private 정적 멤버 클래스로 선언한다.

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

예) 스레드 지역 변수 기능 : 각 스레드가 자신만의 변수를 갖게 해주는 기능

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

만약 이를 클라이언트가 제공한 문자열 키로 스레드별 지역변수를 식별한다고 해보자.
문제점은 아래와 같다.

  • 각 클라이언트가 고유한 값을 쓰지 못 하고 같은 변수를 공유하게 된다면, 두 클라이언트 모두 스레드 지역 변수 기능을 사용할 수 없게 된다.
public class ThreadLocal {
    private ThreadLocal() { }  // 객체 생성 불가
    
    public static class Key {  // (권한)
        Key() { }
    }
    
    // 위조 불가능한 고유 키를 생성한다.
    public static Key getKey() {
        return new Key();
    }
    
    public static void set(Key key, Object value);
    

Key 클래스로 권한을 구분한 경우
이 경우 Key는 스레드 지역 변수를 구분하기 위한 키가 아니라, 그 자체가 스레드 지역변수가 된다.

public final class ThreadLocal {
    public ThreadLocal();
    public void set(Object value);
    public Object get();
}
중첩 클래스 Key의 이름을 ThreadLocal로 변경하자.
하지만, 이 경우에는 get()으로 얻은 Object를 실제 타입으로 형변환해 써야 해서 타입 안전하지 않다.

```java
public final class ThreadLocal<T> {
    public ThreadLocal();
    public void set(T value);
    public T get();
}
}

매개변수화 타입을 사용하여 타입안전하게 만들자.

적합한 데이터 타입이 있거나 새로 작성할 수 있다면, 문자열을 쓰지 말자.
문자열은 같은 변수를 공유할 수 있기 때문에 권한을 표현하기에 적합하지 않다.

0개의 댓글