프로그래밍 하다보면 싱글톤이라는 패턴이 가장 자주 입에 오르내리는거 같다.
왜냐?
만만하니까.

솔직히 여러가지 디자인 패턴들중에서 쓰기도 쉽고 여러모로 유용하기도 하다.

기본적으로 싱글톤 패턴이 사용되는 부분은 시스템 리소스이다.

쉽게 말하자면 '대한민국의 대통령' 이라는 이름의 객체가 여러개 있으면 안되잔아요?

만약에 대통령 객체가 2개가 만들어졌다고 합시다.
그럼 그 객체가 각각 다른일을 하게되는데 대통령이 무슨 분신술을 씁니까 클론이라도 만듭니까?
이런경우에는 무조건 단 하나의 객체만 만들어지도록 강제해야하는겁니다.

근데 자바에서는 기본생성자가 있잔아? 안될거야.....
라고 생각할지도 모르겠지만 제목에 있듯이 private 생성자를 만들수 있습니다.

private 생성자란 뭐냐?
일단 private 라는것부터 집고 넘어가자면 클레스의 내부에서만 사용할수 있다. 라는 라고 한정짓는 접근 제한자 입니다.

쉽게 말해서 대통령의 지갑은 대통령 본인만 건드릴수 있다! 라고 하는겁니다. 뭐 마누라님같은 분이 건드릴수도 있지만 세세한건 넘어가고... (뭔가 대통령을 자꾸 써먹네요)

그러니까 나는 나만 만들수 있다! 라는겁니다.
무슨 지나가던 개가 오줌싸는 소리하느냐. 라고 할수도 있겠지만 프로그래밍에서는 가능합니다.
항목 1에서 팩토리 페턴을 쓸때 생성자를 private 로 만들어두고 newInstance() 를 부르는 쓸데없는짓을 했던걸 기억하나요?

class 대통령{
	대통령 instance = new 대통령();
	private 대통령(){
		
	}
	
	public static 대통령 getInstance(){
		return instance;
	}
	
}

이런 식으로 작성하게되면 절대로 또다른 대통령 객체가 생성되지 않습니다.

근데 직렬화를 한다음 역 직렬화를 하게되면 여러명의 대통령이 생길수 있습니다?!
쉽게말해서 생성자로는 생성이 안되지만 저장한다음에 여러번 읽어버리면 그만이라는 이야기입니다.
이걸 해결하기위해서는 이상한짓을 해야한다는데 저도 당최 이해가 가질 않네요

근데 해결방법이 있습니다.
enum 을 사용하라는 겁니다.
enum 이라는 열거형은 거의 class랑 똑같습니다.(귀찬은 부분이 조금 있지만)
하지만 몇가지 다른점중에 싱글톤에서 유용하게 써먹을수 있는 부분이 바로 정해진 객체만 생성이 가능하다는 점입니다.

enum 대통령{
	이명박;	
}
이렇게 해두면 무슨짓을 해도 대통령 클레스에서는 이명박 이외의 인스턴스를 생성할수가 없습니다. 라고 합니다.
문제는 자바 1.5 이상에서 적용된다고 하는데 자바7이 나온판국에 뭔상관?

근데 직렬화만 안한다면 private 생성자가 여러모로 간편할수도 있으니 참고하세요

다른 방법으로는 인스턴스고 나발이고 다 때려치우고
모조리 스테틱 메소드로 전부 처리. getInstance 고 뭐고 난몰라 라는 방법도 있습니다.
이렇게 하면 항상 메소드 앞에 static 를 붙여줘야되서 귀찬다는!!

걍 알아서 적당히 써봅시다
Posted by 동적할당
: