본문 바로가기

전체 글48

Java | finalizer와 cleaner 사용을 피하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다. 핵심cleaner(java 8까지는 finalizer)는 안전망 역할이나 중요하지 않은 네이티브 자원 회수용으로만 사용하자.물론 이런 경우라도 불확실성과 성능 저하에 주의해야한다. 이유finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있다.finalizers는 java의 객체 소멸자cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다.finalizer과 cleaner로는 제때 실행되어야하는 작업을 할 수 없다.객체에 접근 할 수 없게 된 후 실행까지 얼마나 걸릴지 알 수 없다.상태를 영구적으로 수정하는 작업에서는 절대 fi.. 2024. 7. 4.
Java | 다 쓴 객체 참조를 해제하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다. 핵심메모리 누수는 겉으로 잘 드러나지 않아 시스템에 수년간 잠복하는 사례도 있다.이런 누수는 철저한 코드 리뷰나 힙 프로파일러 같은 디버깅 도구를 동원해야만 발견되기도 한다.그래서 이런 종류의 문제는 예방법을 익혀두는 것이 매우 중요하다. 이유메모리 누수가 일어나는 위치는 어디인가?1. 메모리를 직접 관리하였으나 제거하지 않은 경우package effectivejava.chapter2.item7;import java.util.*;// 코드 7-1 메모리 누수가 일어나는 위치는 어디인가? (36쪽)public class Stack { private Object[] elements; .. 2024. 7. 4.
Java | 불필요한 객체 생성을 피하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다.  이유1. 객채를 매번 생성하기보다는 재사용하는 편이 좋다단 하나의 인스턴스를 사용하면 객체의 재사용성이 보장된다.만약, 무거운 객체라면 매번 생성할 때마다 많은 자원이 들어갈 것이고, 인스턴스를 자주 생성하게 되면 GC가 동작하게 될 확률이 높아지고 이는 애플리케이션 성능을 저하시키는 요인 중 하나이다.대표적인 예시 String참조 링크만약 String이 가변(mutable)이라면 같은 참조를 가지는 객체의 값을 변경할 수 있게 된다. 이는 같은 참조 & 다른 값이라는 상황을 만들 수 있기 때문에 재사용이 불가능하다.따라서 객체 공유를 통한 재사용이 목적인 String Pool을 사용할 .. 2024. 7. 4.
Java | 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다. 핵심클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 준다면 싱글톤과 정적 유틸리티 클래스는 사용하지 않는 것이 좋다.이 자원 들을 클래스가 직접 만들게 해서도 안 된다.대신 필요한 자원을 (혹은 그 자원을 만들어주는 팩터리를) 생성자(정적 팩터리, 빌더)에 넘겨주자.의존 객체 주입이라 하는 이 기법은 클래스의 유연성, 재사용성, 테스트 용이성을 개선해준다. 이유사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다.인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식의존 객체 주입생성자, 정적 팩터리, 빌더.. 2024. 7. 4.
Java | 인스턴스화를 막으려거든 private 생성자를 사용하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다. 핵심의도치 않게 클래스가 인스턴스화 되는 것을 막기 위해서는 prviate 생성자를 추가해라 이유추상 클래스로 만든다고 하더라도 하위 클래스를 만들어 인스턴스화 하면 같은 문제가 생긴다. 관련 코드 및 예시// 기본 생성자가 만들어지는 것을 막기 위함public class ExampleClass { private ExampleClass() { throw new AssertionError(); }}주석을 다는 것도 좋은 방법이다. 2024. 7. 4.
Java | private 생성자나 열거 타입으로 싱글턴임을 보증하라 (Effective Java 3/E - joshua bloch) 해당 글은 이펙티브 자바 (Effective Java 3/E - joshua bloch) 를 읽고 정리한 글입니다.핵심열거 타입 방식의 싱글턴 - 바람직한 방법원소가 하나인 열거 타입을 선언하자. 이유싱글턴(sigleton)이란?인스턴스를 오직 하나만 생성할 수 있는 클래스클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어려워진다.싱글턴을 만드는 방식private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련한다.장점명백히 싱글톤임이 들어남간결함 ... public static final Elvis INSTANCE = new Elvis(); ...정적 팩터리 메서드를 public static 멤버로 제공API를 바꾸지 않고도 싱글턴이 .. 2024. 7. 4.