Study/Effective Java[이펙티브 자바]

[아이템 7] 다 쓴 객체 참조를 해제하라 메모리 관리 자바처럼 가비지 컬렉터를 갖춘 언어를 사용하면 다 쓴 객체를 알아서 회수해주기 때문에 훨씬 편해집니다. 메모리 관리에 더 이상 신경 쓰지 않아도 된다고 오해할 수 있는데, 사실이 아닙니다. 메모리 누수가 일어나는 위치는 어디인가? 다음은 스택을 간단히 구현한 코드입니다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Obje..
클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면 정적 유틸리티 클래스와 싱글턴과 는 사용하지 않는 것이 좋습니다. 이 자원들을 클래스가 직접 만들게 해서도 안되며, 그 대신 필요한 자원을 생성자에 넘겨주는 것이 바람직합니다. 의존 객체 주입을 통해 클래스의 유연성, 재사용성, 테스트 용이성을 개선할 수 있습니다. 정적 유틸리티 클래스를 사용하여 구현 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) { ... } public static ..
가끔 단순히 정적 메서드와 정적 필드만을 포함하는 클래스를 만들고 싶을 때가 있습니다. 이는 객체 지향적 사고 방식과는 다소 거리가 있어서 종종 부적절하게 사용되기도 하지만, 특정 상황에서는 유용하게 사용될 수 있습니다. 예를 들어, java.lang.Math나 java.util.Arrays 같은 클래스는 기본 타입 값이나 배열 관련 메서드들을 모아놓는데 사용됩니다. 또한, java.util.Collections 처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(또는 팩토리 메서드)를 모아놓을 수 있습니다. 이는 자바 8부터 인터페이스에도 가능해졌습니다. 마지막으로, 이러한 방식은 final 클래스와 관련된 메서드들을 모아놓을 때 사용될 수 있습니다. final 클래스는 상속이 불가능하므로,..
싱글턴은 오직 한 번만 인스턴스화 할 수 있는 클래스를 의미합니다. 함수나 시스템 컴포넌트와 같이 설계상 유일하게 존재해야 하는 경우에 사용됩니다. 그러나 이러한 싱글턴 클래스는 테스트하기 어렵다는 단점이 있습니다. 인터페이스를 정의하고 이를 구현하는 방식으로 싱글턴을 사용하면, 싱글턴 인스턴스를 가짜로 대체하는 것이 불가능해집니다. 싱글턴을 만드는 방식은 보통 둘 중 하나입니다. 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단ㅇ으로 public static 멤버를 하나 마련해둡니다. public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } publi..
생성자와 정적 팩토리 메서드의 제약 생성자와 정적 팩토리 메서드에는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 제약이 있습니다. 점층적 생성자 패턴 각 생성자의 매개변수 개수를 다르게 만들어, 여러 개의 생성자를 만드는 방식입니다. public class NutritionFacts { private final int servingSize; // (ml, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 private final int calories; // (1회 제공량당) 필수 private final int fat; // (g/1회 제공량) 필수 private final int sodium; // (mg/1회 제공량) 필수 private..
규니95
'Study/Effective Java[이펙티브 자바]' 카테고리의 글 목록