책/이펙티브자바
-
아이템8. finalizer와 cleaner 사용을 피하라책/이펙티브자바 2021. 6. 26. 18:33
자바에서는 두 가지 객체 소멸 자를 제공한다. finalizer 오동작, 낮은 성능 예측할 수 없고 위험하여 일반적으로 불필요하다. 자신을 수행할 스레드를 제어할 수 없다. finalizer 공격에 노출되어 심각한 보안문제를 일으킬 수 있다. 생성자나 직렬화 과정에서 예외가 발생하면, 악의적으로 하위 클래스의 finalizer가 수행될 수도 있다. GC가 수집하지 못하게 막을 수 있다. 위와 같은 이유로 Java9 에서 deprecated 되었고 새로운 대안으로 cleaner를 소개한다. cleaner finalizer 보다는 덜 위험하다. 하지만 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다. 자신을 수행할 스레드를 제어할 수 있다. 공통사항 즉시 수행된다는 보장이 없다. 실행되기까지 얼마나 ..
-
아이템7. 다 쓴 객체 참조를 해제하라책/이펙티브자바 2021. 6. 23. 22:53
Java의 경우 GC가 메모리 관리를 해준다. 그래서 메모리 관리에 더 이상 신경을 쓰지 않아도 된다고 오해할 수 있으나 절대 사실이 아니다. // 일반적인 Stack 의 pop 메소드 public Object pop() { if (size == 0) { throw new EmptyStackException(); } return elements[--size]; } 특별한 문제는 없어 보일 수 있다. 하지만 '메모리 누수' 의 문제가 있는데 이 프로그램을 오래 실행하면 점차 GC 활동과 메모리 사용량이 늘어나 결국 성능이 저하될 것이다. 상대적으로 드문 경우긴 하지만 디스크 페이징이나 OutOfMemoryError를 일으킬 수 있다. 여기서 문제점은 다 쓴 참조(obsolete reference)를 여전히..
-
아이템6. 불필요한 객체 생성을 피하라책/이펙티브자바 2021. 6. 23. 13:24
객체의 재사용 똑같은 기능의 객체를 매번 생성하기 보다는 객체 하나를 재사용하는 편이 나을때가 많다. 특히, 불변 객체는 언제든 재사용할 수 있다. String 의 객체 생성 String 객체를 생성하는 방법은 new 연산자와 리터럴을 사용하는 방법이 있다. String s1 = new String("kingsubin"); String s2 = new String("kingsubin"); // 이 방법은 매번 새로운 객체를 생성함. System.out.println(s1 == s2); // false String s3 = "kingsubin"; String s4 = "kingsubin"; // 이 방법은 String Constant Pool 이란 곳에서 재사용되어짐. System.out.println(s..
-
아이템5. 자원을 직접 명시하지말고 의존 객체 주입을 사용하라책/이펙티브자바 2021. 6. 21. 12:36
// 정적 유틸리티를 잘못 사용한 예 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} public static boolean isValid(String word) {...} public static List suggestions(String typo) {...} } // 싱글톤을 잘못 사용한 예 public class SpellChecker { private final Lexicon dictionary = ...; private SpellChecker(...) {...} public static SpellChecker INSTANCE = new SpellChecker(.....
-
아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라책/이펙티브자바 2021. 6. 20. 13:55
정적 필드와, 정적 메소드만 담은 유틸리티 클래스는 인스턴스로 만들어 사용하려고 설계한것이 아닌데 생성자를 명시해주지 않는다면 컴파일러가 자동으로 기본 생성자를 만들어준다. → 인스턴스화를 막고싶다면 private 생성자를 만들어준다. 추상 클래스로 만든다고 해도 상속받는 클래스를 생성한 후 인스턴스화 하면 되기에 추상 클래스로 만든다고해서 인스턴스화를 막는다고 할 수는 없다. 상속을 불가능하게 하는 효과도 있음 (모든 생성자는 명시적이든 묵시적이든 상위 클래스의 생성자를 호출하는데 private 생성자라면 하위 클래스가 상위 클래스의 생성자에 접근할 수가 없음.) public class UtilityClass { // 기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용) private Utility..
-
아이템3. private 생성자나 열거 타입으로 싱글턴임을 보증하라책/이펙티브자바 2021. 6. 20. 13:54
싱글톤(singleton) ? 인스턴스를 오직 하나만 생성할 수 있는 클래스 ex) 함수와 같은 무상태(stateless) 객체, 설계상 유일해야 하는 시스템 컴포넌트 장점 한번의 객체 생성으로 재사용이 가능하다. → 메모리 낭비를 방지할 수 있다. → 전역성을 갖기 때문에 다른 객체와 공유가 용이히다. 단점 클래스가 싱글톤이면 이를 사용하는 클라이언트를 테스트하기가 어려워 질 수 있다. → 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글톤이 아니라면 싱글톤 인스턴스를 mock 구현으로 대체할수 없기 때문. 싱글턴을 만드는 방식 1. public static final 필드 방식 생성자는 private 으로 감추기 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤..
-
아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라책/이펙티브자바 2021. 6. 20. 13:53
정적팩토리나 생성자에는 똑같은 제약이 있다. → 둘 다 선택적 매개변수가 많을때 적절히 대응이 어렵다는 점 이렇게 선택적 매개변수가 많을때는 어떻게 효율적으로 사용할 수 있을까 ? 점층적 생성자 패턴 자바빈즈 패턴 빌더 패턴 점층적 생성자 패턴 (telescoping constructor pattern) 필수 매개변수만 받는 생성자 → 필수 매개변수, 선택 매개변수1 ... 필수 매개변수, 선택 매개변수 n ... 이렇게 전부 다 받는 생성자까지 늘려가는 방식 → 쓸 수는 있지만, 매개변수 개수가 많아지면 클라이언트 코드 작성이나 읽기가 어렵다. → 각 값의 의미가 헷갈림. → 타입이 같은 매개변수가 연달아 있으면 찾기 어려움. → 결국 런타임에 엉뚱한 동작 발생. 자바빈즈 패턴 (JavaBeans pa..
-
아이템1. 생성자 대신 정적 팩토리 메소드를 고려하라책/이펙티브자바 2021. 6. 20. 13:51
일반적으로 클라이언트가 클래스의 인스턴스를 얻기 위한 수단은 public 생성자이다. 이 생성자와 별도로 팩토리 메소드를 통하여 인스턴스를 얻을 수 있다. 팩토리 메소드? 클래스의 인스턴스를 반환하는 단순한 정적 메서드 → 책에서 장점 5가지와 단점 2가지를 소개한다. 장점 1. 이름을 가질 수 있다. 생성자 사용시에는 매개변수와 생성자 자체만으로는 반환되는 객체를 설명하기 힘들다. 반면에 정적 팩토리메소드는 이름을 통하여 객체에 대한 설명이 가능하다. public class Bottle { private String brand; private String name; private int price; public Bottle(String brand) { this.brand = brand; } static..