- 빠른 프로그램보다는 좋은 프로그램을 작성하라.
- 성능을 제한하는 설계를 피하라. 완성 후 변경하기가 가장 어려운 설계 요소는 바로 컴포넌트끼리, 혹은 외부 시스템과의 소통 방식이다. 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, 네트워크 프로토콜, 영구 저장용 데이터 포맷 부분은 성능을 염두해 두어야 한다.
'이펙티브 자바 > 9장 일반적인 프로그래밍 원칙' 카테고리의 다른 글
아이템 68 일반적으로 통용되는 명명 규칙을 따르라 (0) | 2023.12.14 |
---|---|
아이템 66 네이티브 메서드는 신중히 사용하라 (0) | 2023.12.14 |
아이템 65 리플렉션보다는 인터페이스를 사용하라 (0) | 2023.12.14 |
아이템 64 객체는 인터페이스를 사용해 참조하라 (0) | 2023.12.14 |
아이템 63 문자열 연결은 느리니 주의하라 (0) | 2023.12.13 |