finalizer, cleaner 사용을 피하라 자바는 finalizer, cleaner이라는 두가지 객체 소멸자를 제공한다. 결론을 미리 말하자면, finalizer, cleaner 사용은 피해야한다. 두 객체 모두 즉시 수행된다는 보장이 없다. 객체에 접근할 수 없게 된 후 finalizer나 cleaner가 실행되기까지 얼마나 걸릴지는 알 수 없다. 때문에 제때 실행되어야 하는 작업은 절대 할 수 없다. finalizer, cleaner를 얼마나 신속하게 수행할지는 전적으로 가비지 컬렉터 알고리즘에 달렸으며, 이는 가비지 컬렉터 구현마다 각기 다르다. finalizer 구현 예제 finalizer 구현예제 public class FinalizerIsBad { @Override protected vo..
싱글턴(Singleton) 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 함수와 같은 무상태(stateless) 객체 설계상 유일해야하는 시스템 컴포넌트 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. ▷ 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문이다. 싱글턴을 만드는 방식 생성자는 private로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련한다. 1) public static 멤버가 final 필드 public class Elvis { /** * 싱글톤 오브젝트 */ public static final ..
public 클래스의 public 필드의 사용(하지마라) public class Point { public double x; public double y; public static void main(String[] args) { Point point = new Point(); // 외부 클래스에서 아래와같이 직접 접근 가능 point.x = 10; point.y = 20; System.out.println(point.x); System.out.println(point.y); } } 위 예제의 public 필드는 아주 위험하다. 이런 클래스는 데이터 필드에 직접 접근이 가능하게되면서, API를 수정하지 않고는 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없고, 외부에서 필드에 접근할때 부수 작업을 수행..
정보은닉 컴포넌트를 설계를 잘하기 위해서는 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 잘 숨겨야한다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 오직 API 를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작에는 전혀 개의치 않는다. 이것을 정보은닉 또는 캡슐화라고 한다. 정보은닉의 장점 1. 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있다. 인터페이스를 개발하면 이에 맞춰서 개발하고, 구현하면된다. 인터페이스를 사용하는 쪽과 지원하는 쪽이 동시에 개발이 가능하다. 2. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있다. 다른 컴포넌트로 교체하는 부담도 적다. 인터페이스 기준으로 캡슐화가 잘 ..