반응형 Java16 Item8 finalizer와 cleaner 사용을 피하라 자바는 두 가지 객체 소멸자를 제공 `finalizer` finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요 오동작, 낮은 성능, 이식성 문제의 원인이 되기도 함 자바 9에서는 finalizer를 deprecated API로 지정 기본적으로 `쓰지 말아야`한다 `cleaner` finalizer보다 덜 위험하다 예측할 수 없다 (언제 실행되는지) 느리고, 일반적으로 불필요 `finalizer와 cleaner의 문제점 불확실성 (수행 보장 X) 자바에서는 접근할 수 없게 된 객체를 회수하는 역할을 GC가 담당 finalizer나 cleaner를 수행할지는 적적으로 `GC 알고리즘`에 달렸고, 구현마다 천차만별 객체에 접근할 수 없게 된 후 finalizer나 cleaner가.. 2023. 1. 15. Item7 다 쓴 객체 참조를 해제하라 자바를 사용하면서 GC(가비지 컬렉터)가 있기 때문에 메모리 관리에 소홀히 한 것은 사실이다. 그런데, 자바에서도 메모리 누수가 발생할 수 있으며, 다른 언어와 마찬가지로 메모리 관리에 신경을 써야한다고 한다. 사실 자바의 컴파일 방식이나 JVM, jdk, jre, 가비지 컬렉터의 동작도 한 번 정리해보려고 한다. 백기선 님의 자바 스터디에서 정리한 글들을 본 적이 있긴 한데 꽤나 어렵고 중요한 내용들이 많았다. 아래의 코드를 보고 메모리 누수가 어디서 일어나는 지 알아보자. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; pub.. 2023. 1. 12. Item6 불필요한 객체 생성을 피하라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 낫다 재사용은 빠르고 세련되다. 특히 불변 객체는 언제든 재사용할 수 있다. 문자열 객체 생성 상황 String s = new String("bikini");// 따라 하지 말 것! String을 new로 생성하면 항상 새로운 객체를 만들게 된다. 혹시라도 이렇게 만들고 있다면 아래와 같이 String 객체를 생성하는 것이 올바르다. String s = "bikini"; new로 String을 생성할 때와 위의 방식은 기능적으로 완전히 똑같다. 만약 new로 String을 반복문이나 빈번히 호출되는 메서드에 사용할 경우 쓸데없는 String 인스턴스가 수백만 개 만들어질 수 있다. 위 코드는 새로운 인스턴스를 만드는 대신 하나의 Str.. 2022. 12. 9. Item5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴 클래스 방식이 적합하지 않다. - 유연하지 않고 테스트하기 어렵다!! 예를 들어 SpellChecker가 Dictionary를 사용하고 Dictionary를 정적 유틸리티 클래스 혹은 싱글턴 클래스 방식으로 만들었다면 하나의 사전에 대해서만 SpellChecker를 작동시킬 수 있다. 하지만 국적에 따라 다른 사전을 사용한다면 유연하게 변경할 수 없으며 다른 국적의 사전은 테스트도 어려워진다. // 정적 유틸리티 클래스 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 publi.. 2022. 12. 7. 이전 1 2 3 4 다음 반응형