- 아이템 5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
public class FruitChecker {
pravate static final Machine sugarCheck = new Machine()...
private FruitChecker() {}
}
객체 내에 다음과 같이 sugarCheck와 같은 자원을 직접 생성하고 있는데,
이런 방식으로 클래스를 구현하면 (특히나 유틸 클래스) 테스트 하기가 어렵다.
public class FruitChecker {
private final Machine sugarChecker;
public FruitChecker(Machine sugarChecker) {
this.sugarChecker = Objects.requireNonNull(sugarChecker);
}
}
이와 같이 의존객체 주입 패턴을 활용하여 외부에서 해당 자원을 입력받게 한다.
이런 방식으로 구현하면 테스트 코드 작성이 쉽고, 외부에서 자원을 입력받기 때문에, 자원에 다른 값이 할당이 되어도 유연하게 처리 가능하다.(단 매개변수가 인터페이스 타입이어야 할 것이다.)
- 아이템 6 - 불필요한 객체 생성을 피하라
String str = new String("superStar");
이와 같이 "superStar" 로 선언하는 것은 "superStar"이 역할이 new String()과 완전히 동일한 역할을 하기 때문에 동일한 일을 두번하게 되는 것이다. 이것이 만약 for문 등과 같이 반복문을 통해 호출된다면, 불필요한 작업이 몇번이나 반복되게 된다. -> 불필요한 생성자는 제거하자
또한 다음과 같이 pattern 과 같은 경우는 인스턴스 생성비용이 크기 때문에 코드처럼 미리 선언해두고 사용하는게 좋다.
public class StringUtils {
private static final Pattern PATTERN = Pattern.compile("정규식...");
static boolean isSameString(String target) {
return PATTERN.matcher(target).matches();
}
}
또 다른 불필요한 객체 생성은 형변환시에 있다.
다음과 같은 계산식이 있을 때, Long 타입으로 선언된 결과 변수 덕분에, long 타입을 더한 후 Long 객체를 생성해서 변경하는 작업이 매번 존재하게 되어 비용이 커진다.
기본 타입(long)으로 통일시켜서 선언하는게 낫다.
private static long calculate() {
Long answer = 0L;
for (long l = 0; l <= Integer.MAX_VALUE; l++) {
answer += l;
}
return answer;
}
- 아이템 7 - 다 쓴 객체 참조를 해제하라
-> 자바는 기본적으로 GC에 의해 메모리가 회수되지만, 객체를 선언하고 빈 상태여도 객체 참조가 살아있으면, GC는 이를 회수하지 않는다.
책에서는 유동적으로 배열의 크기가 증가하고 줄어들 때, 증가한 배열에서 값을 빼내고 배열의 크기(범위)를 줄여도 증가했던 배열 부분을 (앞으로 더이상 안쓰는 객체) null 처리 해주지 않으면, 해당 값은 계속 남아있게 되고 이게 메모리 누수로 이어지며 결국 장애가 발생하게 된다고 설명하고 있다.
이런 객체 참조로 발생하는 장애는 추후 찾기가 어려운 부분이 많기 때문에 코딩할 때 주의를 기울여야 할 것 같다.
- 아이템 8 - finalizer와 cleaner 사용을 피하라
-> finalizer와 cleaner는 자바의 객체 소멸자이다. 그런데 일반적으로 둘다 예측할 수 없고, 불필요 하므로 사용하지 말자.
[자세한 내용은 책을 참조 40~46p]
'책(독서)' 카테고리의 다른 글
[이펙티브자바] ~104p item 13~16 (0) | 2020.10.12 |
---|---|
[이펙티브자바] ~76p item 9~12 (0) | 2020.10.12 |
[이펙티브자바] ~27p item1~4 (0) | 2020.10.05 |
[켄트벡의 구현패턴] ~마지막 (부록 성능측정) (0) | 2020.09.21 |
[켄트벡의 구현패턴] ~ 195p 발전하는 프레임워크 (0) | 2020.09.21 |