본문 바로가기

책 정리17

[이펙티브 자바] 다 쓴 객체 참조를 해제하라 - item 7 메모리 누수 발생 객체 참조가 존재한다면 GC(가비지 컬렉터)가 객체 회수하지 못함. 예시) public class Stack { private Object[] elements; private int size = 0; ... //메모리 누수 발생 public Object pop() { if (size == 0) throw new EmptyStackException(); return elemets[--size]; } } 위 상황에서 element의 원소가 계속 객체를 참조하고 있기 때문에 GC가 회수하지못함 -> 메모리 누수 발생 메모리 누수가 발생한다면 메모리 사용량 증가 -> 성능 저하 유발 심한경우 디스크 페이징, OutOfMemoryError이 발생할 수 있음 참조 해제 (null 처리)로 해결 p.. 2023. 6. 21.
[이펙티브 자바] 불필요한 객체 생성을 피하라 - item 6 new String("Something")의 문제점 새로운 String 인스턴스를 만든다 이 문장이 수백 번 호출되면 수백 개의 인스턴스를 생성한다 String s = "Something"; 위 방식은 하나의 String 인스턴스를 사용한다 참고: String pool - baeldung String.matches의 문제점 static boolean isRomanNumeral(String s) { return s.matches("정규표한식"); } String.matches 내부에서 Pattern 인스턴스를 생성 후 바로 버림 -> Pattern은 생성 비용이 높음 해당 Pattern 인스턴스를 재활용한다면? public class RomanNumerals { private static final Pat.. 2023. 6. 20.
[이펙티브 자바] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 - item 5 특정 자원에 의존하는 클래스라면? 사용하는 자원에 따라 동작이 달라지는 클래스에 적합하지 않은 방식 1. 정적 유틸리티 클래스 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} .. } 2. 싱글턴 클래스 public class SpellChecker { private static SpellChecker INSTANCE = new SpellChecker(,,,); private final Lexicon dictionary = ,,,; } 위와 같은 상황에서 클라이언트의 용도에 맞는 사전을 적용하는 것은 불가능함 만약 final 키워드를 제거한다면? 멀티스레드 상황에서 사용할 .. 2023. 6. 20.
[이펙티브 자바] 인스턴스화를 막으려거든 private 생성자를 사용하라 - item4 의도치 않은 인스턴스화를 막아야한다면? ex) 정적 메서드 or 정적 필드만 담은 클래스로 활용할 때 인스턴스를 만들어 쓰려고 설계한 클래스가 아님 생성자 명시하지 않으면 default public 생성자가 생성됨 puviate 생성자 추가 public class UtilityClass { // 기본 생성자가 만들어지는 것을 막음 private UtilityClass() { throw new AssertionError(); } ... } public 생성자 자동 생성을 막는다 thorw error을 통해 내부의 실수로 인한 호출을 막는다 위해 주석 처리로 throw의 이유를 명시한다 상속을 불가능하게 하는 효과도 있다 Math 클래스의 실제 코드를 확인해보자 위와 같이 활용됨을 확인할 수 있다. 2023. 6. 20.
[이펙티브 자바] private 생성자나 열거 타입으로 싱글턴임을 보증하라 - item 3 public static final 필드 방식의 싱글턴 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuilding() { ...} } privte 생성자는 INSTANCE를 초기화 할 때 딱 한번만 호출된다. pubilc이나 protected 생성자가 없으므로 싱글턴임을 보장한다. 리플렉션을 사용해 private을 호출하는 경우 싱글턴을 깨뜨릴 수 있는데 생성자 두번 호출 시 예외를 반환하도록 하면 된다. 해당 방식의 장점 해당 클래스가 싱글턴임이 API에 드러난다 정적 팩토리 방식의 싱글턴 public class Elvis { private.. 2023. 6. 20.
[이펙티브 자바] 생성자에 매개변수가 많다면 빌더를 고려하라 - item 2 1. 점층적 생성자 패턴 만약 매개변수가 정말 많다면? - bad 클라이언트가 실수할 수 있음 -> 엉뚱한 동작 위험 2. 매개변수 없는 생성 자로 객체를 만든 후 setter로 값 설정 (자바빈즈 패턴) 객체 하나 만드는데 여러 메소드 호출해야함 완전히 생성되기 전까지 일관성이 무너짐 자바빈즈 패턴에서 클래스를 불변으로 만들 수 없음 3. 빌더 패턴 public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; pu.. 2023. 6. 18.