본문 바로가기
Language/Effective java

일반적인 프로그래밍 원칙

by y.j 2022. 8. 11.
728x90

다른 타입이 적절하다면 문자열 사용은 피하라.

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

기본 타입이든 적절한 값 타입이 있으면 그거를 쓰자. 없으면 새로 하나 만드는 것이 더 좋다. 지켜지지 않는 경우가 많다!

 

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

   

문자열 연결은 느리니 주의하라.

여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 대체로 좋지 않은 생각이다. 

  • 각 요소를 개별로 접근하려면 문자열을 파싱해야 해서 느리고, 귀찮고, 오류 가능성도 커진다.
  • equals, toString, compareTo 메서드를 제공 할 수 없다.
String compoundKey = className + "#" + i.next();

 

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

자바2에서는 스레드의 권한을 설정하기 위해 문자열로 key를 설정했다. 만약 클라이언트가 지역 스레드를 같은 이름으로 등록한다면 의도대로 동작할 수가 없다. 

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 Key getKey() {
        return new Key();
    }
    
    public static void set(Key key, Object value);
    public static Object get(key key);
}

 

하지만 Object는 형변환을 해야 하기 때문에 매개변수화 타입으로 선언해주면 더 좋다.

public class ThreadLocal<T> {

    private ThreadLocal() { }

    public static Key getKey() {
        return new Key();
    }

    public static void set(T value);
    public static T get();
}

 

문자열 연결은 느리니 주의하라.

문자열 연결 연산자로 문자열 n개를 잇는 시간은 $n^2$ 에 비례한다.

품목이 많을 경우 이 메서드는 심각하게 느려질 수 있다.

public String statement() {
    String result = "";
    for(int i = 0; i < numItems(); i++)
        result += lineForItem(i);
    return result;
}

 

성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하자.

public String statement2() {
    StringBuilder b = new StringBuilder(numItems() * LINE_WIDTH);
    for(int i = 0; i < numItems(); ++i)
        b.append(lineForItem(i));
    return b.toString();
}

 

객체 인터페이스를 사용해 참조하라.

적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값, 변수, 필드를 전부 인터페이스 타입으로 선언하라.

인터페이스를 타입으로 사용하는 습관을 길러두면 프로그램이 훨씬 유연해진다. 

Set<Son> sonSet = new LinkedHashSet<>();

 

위 코드에서 구현클래스를 교체하고자 한다면 호출을 해주기만 하면 된다.

Set<Son> sonSet = new HashSet<>();

 

적합한 인터페이스가 없다면 당연히 클래스로 참조해야 한다. 

  • String, BigInteger같은 값 클래스들은 인터페이스가 존재하지 않는다.
  • 클래스 기반으로 작성된 프레임워크가 제공하는 객체들이다. ( java.io 패키지 )
  • 인터페이스에는 없는 특별한 메서드를 제공하는 클래스가 있다. PriorityQueue는 Queue인터페이스에는 없는 comparator 메서드를 제공한다.

 

적합한 인터페이스가 없다면 클래스 계층구조 중 필요한 기능을 만족하는 가장 덜 구체적인(상위의) 클래스를 타입으로 사용하자.

 

 

 

 

 

 

728x90

'Language > Effective java' 카테고리의 다른 글

예외  (0) 2022.08.17
일반적인 프로그래밍 원칙  (0) 2022.08.12
일반적인 프로그래밍 원칙  (0) 2022.08.10
일반적인 프로그래밍 원칙  (0) 2022.08.08
메서드  (0) 2022.08.04

댓글