아이템 8번은 객체의 소멸에 대한 이야기 둘다 사용하지 마라 원하는 시점에 객체가 제거된다고 보장할 수 없다. 소켓이나 파일 읽어올 때 읽어올 수 있는 수의 제한이 있다 이걸 무한정 읽어오게되면 너무 많은 객체를 불러오게되어 에러가 난다. 이런 에러의 근본적 원인이 사용한 자원 반납이 제대로 처리되지 않아서 디비 커넥션, 네트워크 커넥션 리소스 정리가 안되면 문제가 생긴다. 적절한 타이밍에 정리가 안되는게 finalizer, cleaner 언제 실행될지 모른다. finalizer() 내에서 리소스 정리하는 로직이 들어간다면 예외가 발생하면 처리할 작업이 남아있어도 자원이 반납이 안된채로 어플리케이션이 종료된다. package item8.finalizer; public class FinalizerIsBad..
객체 참조 해제란 메서드 내에서 사용할 객체를 인스턴스화 하여 로컬 변수에 할당하여 참조하고 사용 후 더 이상 사용하지 않는다고 명시적 null처리로 참조 관계를 끊어주거나 해당 메서드가 종료되면 더 이상 사용하지 않을 인스턴스로 참조 관계를 해지하는 것. 보통은 메서드 종료시 변수가 유효 범위를 벗어나게 되어 더 이상 사용하지 않아 가비지 컬렉터가 참조 관계가 끊어진 객체를 회수하는게 가장 좋지만 그렇지 않은 예외적인 경우도 있다. 책에서 나온 예제 코드를 본다면 package effectiveJava.item7; import java.util.Arrays; import java.util.EmptyStackException; public class Stack { private Object[] eleme..
같은 기능이 요청올 때 마다 매번 새로운 인스턴스를 생성하기 보다는 하나의 객체가 재사용되는게 나을때가 있다. 불변객체라면 언제든 재사용할 수 있다. 문자열을 변수에 할당 할 때 String s = new String ("문자열"); String s2 = "문자열"; 생성자 방식은 매번 인스턴스를 만들지만 리터럴 방식은 하나의 String 인스턴스를 사용한다. 또한 이 방식은 똑같은 문자열을 선언할 경우 fly weight pool에 있는 문자열 참조값을 같이 사용할 수 있다. Boolean 클래스의 생성자 같은 경우 deprecated 되어 있으므로 정적 팩터리 메서드인 Boolean.valueOf(string)을 사용하는 것이 좋다. 생성 비용이 비싼 객체 (CPU나 메모리 많이 잡아먹는 애)라면 더..
어플리케이션을 만들다보면 어떤한 객체의 기능을 공통적으로 사용해야 하는 경우가 생긴다. 예를 들어 맞춤법 검사기라는 객체를 만들고 맞춤법 검사하는 메서드를 만들어 어디에서든 문장값이 주어지면 맞춤법이 맞는지 true, false 값을 내뱉는 메서드를 만든다고 가정했을 때 개발자는 정적 유틸리티 클래스를 만들어 전역으로 사용하려 할 수 있다. 맞춤법 검사를 할때 받은 문자열을 확인하려면 사전객체에 의존하게 된다. 클래스 내에 사전 객체가 생성되어 사용하는데 이 사전객체를 개발 초기에는 한글사전만 필요하다고 했다 치더라도 어플리케이션이 커져가며 영어도 검사하고 일본어, 중국어도 검사하게 될 가능성이 있다면 클래스에서 여러 자원 인스턴스를 지원하게 해야 유연해진다. 정적 유틸리티 클래스와 싱글턴 방식은 1개의..
static method와 static field 만을 담은 클래스. 보통 유틸성 클래스로 helper의 성격을 갖는 클래스 DateUtility나 StringUtility 공통으로 쓰여질 메서드나 변수를 선언해 놓는 곳. 이런 클래스들은 클래스 메서드와 클래스 인스턴스이니 객체 인스턴스가 필요없는 클래스가 되는데 인스턴스화를 막기위해 abstract 클래스로 만들어 주는 방법이 있지만 해당 클래스를 자식이 상속을 받게되면 인스턴스화가 가능해진다. 프로그램이 시작되면서 (Run) .class 파일들이 JVM 으로 실행되면서 할당된 메모리에 올라갈 때 static이 붙은 멤버들은 static 영역에 할당되어 종료가 될 때까지 전역에서 사용이 가능하다. Heap 영역은 객체가 생성될 때 인스턴스화 된 애들이..