Skip to content

Latest commit

 

History

History
78 lines (56 loc) · 2.27 KB

62_다른타입이_적절하다면_문자열사용_파하라.md

File metadata and controls

78 lines (56 loc) · 2.27 KB

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

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

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

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

  • 아이템 34

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

  • 여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 대체로 좋지 않다.
String compoundKey = className + "#" + i.next();
  • 단점
    • 구분 문자 '#'이 두 요소 중 하나에서 쓰이면 혼란
    • 각 요소를 개별로 접근하려면 문자열 파싱해야되서 느리고, 오류가능성
    • 적절한 equals, toString, compareTo 메서드 제공 못함

문자열은 권한을 표현하기 적합하지 않음

ex)

  • 각 스레드가 자신만의 변수를 갖게 해주는 기능
// 잘못된 예
public class ThreadLocal {
    private ThreadLocal() { }

    public static void set(String key, Object value); // 한 스레드의 값을 키로 구분해 저장

    public static Object get(String key); // (키가 가리키는) 현 스레드의 값 반환)
}
  • 문제점
    • 문자열 키가 전역 이름공간에서 공유
      • 각 클라이언트가 고유한 키를 사용하지 않으면? 의도치 않게 같은 변수를 공유하게됨
    • 보안에 취약
      • 악의 적인 클라이언트가 의도적으로 같은 키로 다른 클라이언트 값 가져올 수 있다.
// 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); 
    public static Object get(Key key); 
}
  • 문자열 기반 문제점 2가지 해결
public class ThreadLocal <T> {
    public ThreadLocal();
    public void set(T value);
    public T get();
}
  • 개선
    • 정적 메서드를 인스턴스 메서드로 바꿈
    • ThreadLcocal 삭제하고 Key클래스를 ThreadLcocal로 바꿈
  • 그 자체가 스레드 지역벼눗가 된다.