티스토리 뷰


Singleton


싱글턴은 객체를 하나만 만들 수 있는 클래스다.

싱글턴을 구현하는 흔히 사용하는 방법 두가지는 다음과 같다.


생성자를 private로 선언하고 public static final로 선언한 필드 변수에 인스턴스 저장

생성자를 private로 선언하고 public statc ClassType getInstance() { return INSTANCE;}


public class Elvis {
	private static final Elvis INSTANCE = new Elvis();
	private Elvis() { ... }
	public static Elvis getInstance() { return INSTANCE; }
	public void leaveTheBuilding() { ... }
}

위 코드는 싱글턴 패턴의 한 예이다.

주의할점은 싱글턴 클래스를 직렬화 가능 클래스로 만들려면 클래스 선언에 implements Serializable을 추가하는 것으로는 부족하다. 싱글턴 특성을 유지하려면 모든 필드를 transient 선언하고 readResolve 메서드를 추가해야 한다. 그렇지 않으면 serialize된 객체가 역직렬화(deserialize)될 때마다 새로운 객체가 생성된는 문제점이 있다.

또 하나 주의할 점은 리플렉션(reflection)을 통해 private 생성자 권한을 뚫어 객체를 생성하는 공격을 막을 수 없다.


위 두가지 문제를 해결할 수 있는 방법은 원소가 하나뿐인 enum 클래스를 이용하여 싱글턴 패턴을 구현하는 것이다.

public enum Elvis {
	INSTANCE;
	public void leaveTheBuilding() { ... }
}

위 방법은 JDK 1.5부터 사용이 가능하다. 이 접근법은 직렬화가 아무리 복잡하게 이루어져도 여러 객체가 생길 일이 없으며, 리플렉션(reflection)을 통한 공격에도 안전하다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함