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

들어가며

문자열은 다른 값 타입을 대신하기에 적합하지 않다. 문자열은 데이터가 진짜 문자열일 때만 사용하는게 좋다. 입력받은 데이터가 수치형이라면 int, float같은 타입을 사용하고 예 / 아니오의 질문이라면 boolean이나 enum을 사용해야 한다. 또한 문자열을 혼합타입을 대신하기에 적합하지 않다. 다음 코드를 보자.

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

만약 위 코드의 데이터 내에 # 이 들어있다면 파싱하기 곤란해진다. 또한 데이터를 얻기 위해 문자열을 파싱해야해서 느려진다. 이럴때는 차라리 private static member class로 만드는 편이 낫다.

문자열은 권한을 표현하는데 적합하지 않다. 스레드별 로컬 변수를 지원하는 기능을 가진 다음 코드를 보자.

1
2
3
4
5
public class ThreadLocal {
private ThreadLocal() {}
public static void set(String key, Object value);
public static Object get(String key);
}

위 코드는 key를 문자열로 받는다. 만약 서로 다른 스레드가 같은 키를 사용한다면 위험한 결과를 불러온다. 다음 코드를 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
public static Object get(Key key);
}

위 코드에서는 키를 고유한 값으로 사용하기 위한 조취를 취했다 그러다 보니 ThreadLocal 클래스가 하는 일이 적어졌다. 다음 코드를 보자.

1
2
3
4
5
public final class ThreadLocal {
public ThreadLocal();
public void set(Object value);
public Object get();
}

위 코드는 ThreadLocal을 없애고 Key 클래스를 ThreadLocal로 변경했다. 하지만 이 코드에도 단점이 있다. Object를 반환하는데 이 때 형 변환이 필요한 점이다. 이를 개선하기위해 제네릭으로 수정하면 다음과 같다.

1
2
3
4
5
public final class ThreadLocal<T> {
public ThreadLocal();
public void set(T value);
public T get();
}
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/21/Languages/Effective%20JAVA/item62/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.