[Effective Java 3rd] 아이템6~9

Mr.Sir·2022년 6월 5일
1

Effective java 스터디

아이템6 불필요한 객체 생성을 피하라

  • 똑같은 기능의 객체를 매번 생성하기보다는
    객체 하나를 재사용하는 면이 나을 때가 많다.

  • 인스턴스를 static final 필드로 지정하고 이름을 지어 코드의 의미를 잘 전달할 수 있다.

  • 오토박싱 : 기본 타입과 박싱된 기본 타입을 섞어 쓸 때 자동으로 상호 변환해주는 기술.
    기본 타입과 그에 대응하는 박싱된 기본 타입의 구분을 흐려주지만,
    완전히 없애주는 것은 아니다.

기존 객체를 재사용해야 한다면 새로운 객체를 만들지 마라.

새로운 객체를 만들어야 한다면 기존 객체를 재사용하지 마라.


아이템7 다 쓴 객체 참조를 해제하라.

가비지 컬렉션 언어에서는 (의도치 않게 객체를 살려두는) 메모리 누수를 찾기가 까다롭다.
객체가 참조하는 모든 객체를 회수해가지 못한다.
=> 해당 참조를 다 썼을 때 null 처리(참조 해제)하면 된다.
객체 참조를 null 처리하는 일은 예외적인 경우여야 한다.
일반적으로 자기 메모리를 직접 관리하는 클래스라면 프로그래머는 항시 메모리 누수에 주의해야 한다.
원소를 다 사용한 즉시 그 원소가 참조한 객체들을 다 null 처리해야 한다.
캐시 역시 메모리 누수를 일으키는 주범이다.
리스너와 콜백 : 클라이언트가 콜백을 등록만 하고 명확히 해지하지 않는다면, 뭔가 조치해주지 않는 한 콜백은 쌓임.


아이템8 finalizer 와 cleaner 사용을 피하라.

  • finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다.
  • cleaner : 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하나, 불확실성과 성능 저하에 주의.

아이템9 try~finally 보다는 try~with~resources를 사용하라.

자원닫기는 클라이언트가 놓치기 쉬워서 예측할 수 없는 성능 문제로 이어지기도 한다.

static String firstLineOfFile(String path) throws IOException {
          try(BufferedReader br = new BufferedReader(new FileReader(path))) {
                    return br.readLine();
          }
}

꼭 회수해야 하는 자원을 다룰 때는 try-with-resources를 사용하자.
예외는 없다. 코드는 더 짧고 분명해지고, 만들어지는 예외 정보도 훨씬 유용하다.

profile
Deepveloper

0개의 댓글