본문 바로가기

Dev Book Review/Effective Java

[Effective Java] Chapter 2 Summary : 객체 생성과 파괴

Item1. 생성자 대신 정적 팩터리 메서드를 고려하라

  • 정적 팩터리 메서드와 public 생성자는 각각의 쓰임새가 있다.
  • 그래도 정적 팩터리 사용이 유리한 경우가 더 많다.
  • 무작정 public 생성자를 제공하던 습관을 고치자
  • Link : https://jyami.tistory.com/56
 

item1. 생성자 대신 정적 팩터리 메서드를 고려하라

1. 정적 팩터리 메서드의 장점 ㄱ. 이름을 가질 수 있다. 생성자정적 팩터리 메서드 시그니처가 같은 생성자가 여러개 필요할 것 같을때 정적 팩터리 메서드를 사용하자 생성자 정적 팩터리 메서드 특징설명 X O..

jyami.tistory.com

 

Item2. 생성자에 매개변수가 많다면 빌더를 고려하라

  • 생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면 빌더 패턴을 선택하는 게 더 낫다.
  • 매개변수중 다수가 필수가 아니거나 같은 타입이면 특히 더 그렇다.
  • 빌더는 점층적 생성자보다 클라이언트를 읽고 쓰기가 훨씬 간결하다.
  • 빌더는 자바빈즈보다 훨씬 안전하다.
  • Link : https://jyami.tistory.com/57
 

item2. 생성자에 매개변수가 많다면 빌더를 고려해라

정적 팩터리 + 생성자의 제약 = 선택적 매개변수가 많을 때 적절히 대응하기 어렵다 1. 대안A) 점층적 생성자 패턴 (telescoping constructor pattern) 필수 매개변수 + 선택 매개변수 원하는 매개변수를 모두 포..

jyami.tistory.com

 

Item3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

  • 싱글턴 : 인스턴스를 오직 하나만 생성할 수 있는 클래스이다.
  • public static 멤버가 final 필드 / 정적 팩터리 메서드를 public static 멤버로 제공 / Enum 타입 방식 으로 싱글턴을 만들 수 있다.
  • 대부분 상황에서 원소가 하나뿐인 Enum이 싱글턴을 만드는 가장 좋은 방법이다.
  • Link : https://jyami.tistory.com/58
 

item3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

1. 싱글턴이란? 싱글턴(singleton) : 인스턴스를 오직 하나만 생성할 수 있는 클래스 함수와 같은 무상태(stateless) 객체 - 정적 멤버클래스 이야기인가? (Enum 같은거?) 설계상 유일해야하는 시스템 컴포넌트 클..

jyami.tistory.com

 

Item4. 인스턴스화를 막으려거든 private 생성자를 사용하라

  • 정적 메서드와 정적 필드만을 담는 클래스에서 인스턴스 화를 막을 때 private 생성자를 사용하라
  • Private 생성자를 쓰지 않으면 컴파일러가 자동으로 기본 생성자를 만들어 인스턴스화가 가능해진다.
  • Link : https://jyami.tistory.com/59
 

item4. 인스턴스화를 막으려거든 private 생성자를 사용하라

1. 정적 메서드와 정적 필드만을 담을 클래스의 쓰임새 기본타입 값이나 배열 관련 메서드를 모아 둘 때 (java.lang.Math, java.util.Arrays) 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(팩터리)..

jyami.tistory.com

 

Item5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

  • 클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면 싱글턴과 정적 유틸리티 클래스는 사용하지 않는 것이 좋다.
  • 이 자원들을 클래스가 직접 만들게 해서도 안된다.
  • 필요한 자원(그 자원을 만들어주는 팩터리를) 생성자에 (정적 팩터리나 빌더에) 넘겨주자. (의존 객체 주입)
  • 클래스 유연성, 재사용성, 테스트 용이성을 개선해준다.
  • Link : https://jyami.tistory.com/60
 

item5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식을 사용하자 의존 객체 주입의 형태!! // 정..

jyami.tistory.com

 

Item6. 불필요한 객체 생성을 피하라

  • 같은 기능의 객체를 매번 생성하기보다 불변객체나, 정적 팩터리를 이용해 객체 하나를 재사용하라
  • 생성비용이 비싼 객체가 반복해서 필요하다면 캐싱하여 재사용길 권한다.
  • 어댑터 패턴에서 뒷단 객체 하나당 어댑터 하나씩만 만들어지면 충분하다.
  • 박싱된 기본타입보단 기본타입을 사용하고, 의도치 않은 오토박싱이 숨어들지 않도록 주의하자
  • 가벼운 객체를 다룰땐 직접 만든 객체 풀보단 GC가 훨씬 빠르다.
  • Link : https://jyami.tistory.com/61
 

item6. 불필요한 객체 생성을 피하라

1. 객체 재사용 똑같은 기능의 객체를 매번 사용하기 보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 불변 객체는 언제든 재사용가능하다. String s = new String("hello"); // Heap 영역에 존재 String s =..

jyami.tistory.com

 

Item7. 다 쓴 객체는 참조를 해제하라

  • 메모리 누수는 겉으로 잘 드러나지 않아 시스템에 수년간 잠복하는 사례도 있다.
  • 이런 누수는 철저한 코드 리뷰나 힙 프로파일러 같은 디버깅 도구를 동원해야만 발견되기도 한다.
  • 예방법을 알아두자 ex) LRU에서 WeakHashMap 사용
  • Link : https://jyami.tistory.com/62
 

item7. 다 쓴 객체 참조를 해제하라

1. GC의 메모리 누수 : null로 해제 GC가 다쓴객체를 알아서 회수해간다고, 메모리 관리에 아예 신경을 안쓰면 안된다. // 코드 7-1 메모리 누수가 일어나는 위치는 어디인가? (36쪽) public class Stack { privat..

jyami.tistory.com

 

Item8. finalizer와 cleaner 사용을 피해라

  • cleaner(자바 8까지는 finalizer)는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자.
  • 이런 경우에 불확실성과 성능저하에 주의해야한다.
  • Link : https://jyami.tistory.com/63
 

item8. finalizer와 cleaner 사용을 피해라

1. 자바의 객체 소멸자 finailzer : 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다. 오동작, 낮은 성능, 이식성 문제의 원인 "쓰지말자" cleaner : finailzer보단 덜 위험하지만, 여전히 예..

jyami.tistory.com

 

Item9. try-finally 보다는 try-with-resources를 사용하라

  • try-finally는 코드 가독성에 있어서 지저분하고, 두번째 예외가 첫번째 예외를 집어삼키는 경우가 있을 수 있다.
  • try-with-resources는 일기 쉬워 문제 진단에 유리하며, 숨겨진 예외도 suppressed 꼬리표를 달고 출력된다.
  • try-with-resources는 catch를 이용해 try 중첩없이 다수의 예외처리가 가능하다.
  • Link : https://jyami.tistory.com/64
 

item9. try-finally 보다는 try-with-resources를 사용하라

close()를 사용해 직접 닫아줘야하는 자바 자원 : InputStream OutputStream, java.sql.Connection 1. 자원이 닫힘을 보장하는 수단 try-finally의 단점 코드 가독성에있어서 지저분하다. 두번째 예외가 첫번째 예..

jyami.tistory.com