반응형 Effective Java8 이펙티브 자바 - 아이템 8. finalizer와 cleaner 사용을 피하라 이펙티브 자바(Effective java)를 읽고 정리한 글입니다. 자바는 finalizer, cleaner 두 가지 객체 소멸자를 제공한다. finalizer는 기본적으로 사용하지 않아야 한다. 예측할 수 없고, 오동작 및 낮은 성능 등의 원인이 되기도 한다. finalizer 대안으로 등장한 cleaner는 상대적으로 덜 위험하다. 하지만 동일하게 예측할 수 없고, 불필요하다. 왜 사용하면 안 될까1. finalizer와 cleaner는 즉시 수행된다는 보장이 없다. 즉, 이들을 이용하여 제 때 실행되어야 하는 작업은 수행할 수 없다. finalizer와 cleaner의 수행 시점은 가비지 컬렉터 알고리즘에 달려 있다. finalizer를 달아두면 인스턴스 자원 회수가 지연될 수 있다. final.. 2024. 9. 4. 이펙티브 자바 - 아이템 7. 다 쓴 객체 참조를 해제하라 이펙티브 자바(Effective java)를 읽고 정리한 글입니다. 가비지 컬렉터를 가진 Java를 사용하더라도 메모리 관리에 신경 쓰지 않아도 되는 것은 아니다. 메모리 누수와 참조 해제 가비지 컬렉션 언어에서는 메모리 누수를 찾기 매우 까다롭다 (의도치 않게 객체를 살려두는 경우). 객체 참조 하나를 살려두면 그 객체가 참조하는 모든 객체를 회수하지 못한다. 이는 잠재적으로 성능에 악영향을 줄 수 있다. 우리는 이 문제는 참조를 다쓴 객체를 null 처리하여 해결할 수 있다.즉, 참조 해제를 통해 가능하다. null 처리를 해두면, 실수로 해당 객체를 참조하려 할 때 NPE 가 발생한다.이를 통해 오류를 조기에 발견할 수 있다.하지만 모든 경우에 null 처리할 필요는 없다. 객체 참조를 null.. 2024. 9. 4. 이펙티브 자바 - 아이템 6. 불필요한 객체 생성을 피하라 이펙티브 자바(Effective java) 를 읽고 정리한 글입니다. 같은 기능의 객체를 매번 생성하는 것 보다, 하나의 객체를 재사용하는 것이 좋다. 불필요한 객체 생성 피하기1. 정적 팩터리 메서드를 제공하는 불변 클래스에서는 불필요한 객체 생성을 피할 수 있다. 2. 생성 비용이 비싼 객체는 캐싱하여 재사용할 수 있다. 예를 들어 정규표현식용 Pattern 은 입력받은 정규표현식에 해당하는 유한 상태 머신을 만들어서 인스턴스 생성 비용이 높다. 성능을 고려해서 Pattern 인스턴스를 클래스 초기화 과정에서 직접 캐싱해둘 수 있다. 3. 오토박싱(auto boxing) 과정에서도 불필요한 객체가 생성될 수 있다. 오토박싱은 원시 타입과 박싱 타입의 구분을 흐려주지만, 완전히 없애주는 것은 아.. 2024. 8. 20. 이펙티브 자바 - 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 이펙티브 자바(Effective java) 를 읽고정리한 글입니다. 많은 클래스가 하나 이상의 자원에 의존한다. 이 때, 사용하는 자원에 따라 다르게 동작해야 하는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다.또한 이들은 잘못 사용하면 유연하지 않고 테스트하기 어렵다. 이러한 클래스는 여러 자원 인스턴스를 지원하고, 클라이언트가 원하는 자원을 사용해야 한다. 우리는 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식을 이용해 이를 만족시킬 수 있다. 의존 객체 주입 패턴 장점public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Lexicon dictionary) { .. 2024. 8. 20. 이펙티브 자바 - 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 이펙티브 자바(Effective java) 를 읽고 정리한 글입니다. 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어서 쓰려고 설계하는 것이 아니다.그렇기 때문에 인스턴스화가 불가하도록 막아야 한다. 인스턴스화 방지 컴파일러는 자동으로 기본 생성자를 만든다. 우리는 유틸리티 클래스가 의도치 않게 인스턴스화가 가능하도록 두지 말아야 한다.그러니 prvate 생성자를 추가하여 클래스의 인스턴스화를 막자. public class UtilityClass { private UtilityClass() { throw new AssertionError (); } // ... } 위와 같이 생성자 내부에서 Error 를 던지도록 하면, 클래스 내부에서 실수로 생성자를 호출하는 일.. 2024. 8. 17. 이펙티브 자바 - 아이템3. private 생성자나 열거 타입으로 싱글턴임을 보증하라. 이펙티브 자바(Effective java) 를 읽고 정리한 글입니다. 싱글턴(singleton): 인스턴스를 오직 하나만 생성할 수 있는 클래스. 예시) 함수 같은 무상태(stateless) 객체나 유일해야 하는 컴포넌트 그럼 싱글턴을 만드는 방식에 대해 알아보자. 싱글턴을 만드는 일방적인 방식 생성자는 private으로 감추고, public static 멤버 하나로 인스턴스에 접근할 수 있게 한다.→ 클래스가 싱글턴임이 API에 명백히 드러나는 장점이 있다.정적 팩터리 메서드를 public static 멤버로 공개한다.→ API를 바꾸지 않고도 싱글턴이 아니게 변경할 수 있다는 장점이 있다.→ 원한다면 정적 팩터리를 제네릭 싱글턴 팩터리로 만들 수 있다는 장점이 있다.→ 정적 팩터리의 메서드 참조를.. 2024. 8. 14. 이펙티브 자바 - 아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라 이펙티브 자바(Effective java) 를 읽고 정리한 글입니다. 정적 팩터리 메서드, 생성자는 선택적 매개변수가 많을 때 적절한 대응을 하기 어렵다는 제약을 가진다. 물론 점층적 생성자 패턴(telescoping constructor pattern)을 사용할 수 있지만, 매개변수 개수가 증가하면 클라이언트 코드를 작성하거나 읽기 어려워진다. 또한 타입이 같은 매개변수의 순서를 바꾸는 등 개발자가 실수하기 쉽다. 다른 방법으로 setter를 사용하는 자바빈즈 패턴 방식이 있지만, 객체를 생성하기 위해 다수의 메서드를 호출해야 하고, 객체 생성 전까지 일관성이 유지되지 않는다. 즉, 객체의 불변성이 유지되지 않는다. 빌더 패턴(builder pattern)은 점층적 생성자 패턴의 안전성과 자바빈즈 .. 2024. 8. 13. 이펙티브 자바 - 아이템1. 생성자 대신 정적 팩터리 메서드를 고려하라. 이펙티브 자바(Effective java) 를 읽고 정리한 글입니다. 클래스는 생성자와 별도로 정적 팩터리 메서드(static factory method)를 제공할 수 있다. 정적 팩터리 메서드는 단순히 클래스의 인스턴스를 반환하는 정적 메서드이다. 그 예시로 우리가 자주 사용하는 boolean 타입 의 박싱 클래스인 Boolean 의 일부 코드를 보면 쉽게 이해할 수 있다.public static Boolean value0f(boolean b) { return b ? Boolean. TRUE : Boolean. FALSE; } 그럼 이제 정적 팩터리 메서드는 어떤 특징을 가지는지 알아보자.장점정적 팩터리 메서드의 장점은 아래와 같다. 1. 이름을 가질 수 있다.생성자는 그 자체만으로 반환될 객체의 특성.. 2024. 8. 12. 이전 1 다음 반응형