이펙티브 자바/9장 일반적인 프로그래밍 원칙

아이템 67 최적화는 신중히 하라

말랑공룡 2023. 12. 14. 20:33

 

- 빠른 프로그램보다는 좋은 프로그램을 작성하라.

- 성능을 제한하는 설계를 피하라. 완성 후 변경하기가 가장 어려운 설계 요소는 바로 컴포넌트끼리, 혹은 외부 시스템과의 소통 방식이다. API, 네트워크  프로토콜, 영구 저장용 데이터 포맷 등이 대표적이다.

- API 설계 시에도 성능에 주는 영향을 고려하라.

  • public 타입을 가변으로 만들면, 즉 내부 데이터를 변경할 수 있게 만들면 불필요한 방어적 복사를 수없이 유발할 수 있다.
  • 간단한 예시로 설명하면, 만약 메서드가 배열을 반환하는데 이 배열이 가변이라면, 클라이언트 코드에서는 해당 배열을 수정할 수 있다. 이로 인해 의도하지 않은 부작용이 발생할 수 있고, 이를 방어하기 위해 추가적인 조치를 취해야 한다.
  • 방어적 복사(Defensive Copying)란 프로그램에서 객체를 복사하여 새로운 인스턴스를 생성하고, 이를 통해 원본 객체의 불변성을 보장하는 기법을 의미한다.

 

public class MyClass {
    private List<String> myMutableList;

    public MyClass(List<String> originalList) {
        // 방어적 복사를 통해 외부에서 전달된 리스트를 수정하지 않도록 함
        this.myMutableList = new ArrayList<>(originalList);
    }

    public List<String> getMyMutableList() {
        // 복사된 리스트를 반환하여 원본 리스트를 보호
        return new ArrayList<>(myMutableList);
    }
}

 

 

- 상속보다는 컴포지션으로 해결하라.

- 구현 타입보다는 인터페이스를 사용하라.

- 성능을 위해 API를 왜곡하는 건 매우 안 좋은 생각이다.

- 각각의 최적화 시도 전후로 성능을 측정하라.

- 자바의 성능 모델은 정교하지 않을뿐더러 구현 시스템, 릴리스, 프로세서마다 차이가 있다.

- 빠른 프로그램을 작성하려 안달할 필요가 없지만 설계 시에 API, 네트워크 프로토콜, 영구 저장용 데이터 포맷 부분은 성능을 염두해 두어야 한다.