1 분 소요

전체 프로그램에서 단 하나의 인스턴스만 생성할 수 있도록 하는 방법을 싱글톤(Singleton)이라 한다.

자바에서 싱글톤을 만들기 위해선 우선 클래스 내부에서 자기 자신의 객체를 하나 생성하여 이를 static 변수에 저장한 뒤, 싱글톤을 정의하는 클래스 외부에서 해당 클래스를 인스턴스화할 수 없게 만들어야 한다. 이 과정에서 static과 private 키워드가 사용된다.

다음은 자바에서 싱글톤을 구현한 예제이다.

class Singleton {
	
	/*
	 * private를 붙여 외부에서 해당 필드 변수에 
	 * 직접 접근하여 값을 변경하지 못하도록 방지.
	 */
	private static Singleton sglt = new Singleton();
	
	/*
	 * 기본 생성자.
	 * private로 설정함으로써 외부에서 해당 클래스로부터
	 * 인스턴스를 생성하지 못하게 한다. 
	 */
	private Singleton() {}
	
	/*
	 * 싱글톤 인스턴스를 얻으려면 다음의 메서드를 호출하여 사용해야 함.
	 * sglt 변수에 대한 getter 메서드.
	 */
	static Singleton getInstance() {
		return sglt;
	}
	
	void sayHello() {
		System.out.println("Hi from Singleton!");
	}
}

public class MySingleton {
	public static void main(String[] args) {
		// 외부에서 싱글톤 객체 생성 시도 => 에러.
		// Singleton sg = new Singleton();
		
		// 싱글톤 인스턴스를 얻는 유일한 방법.
		Singleton sg1 = Singleton.getInstance();
		Singleton sg2 = Singleton.getInstance();
		
		sg1.sayHello();
		sg2.sayHello();
		
		// 서로 같은 객체를 참조하는가? 
		// 싱글톤이므로 둘 다 같은 객체를 참조해야 함.
		System.out.println(sg1 == sg2);  // true
	}
}

예제 1-1

Hi from Singleton!
Hi from Singleton!
true

예제 1-1 실행결과

싱글톤은 외부에서 클래스를 생성할 수 없게끔 고안되어야 한다고 하였다. 따라서 싱글톤 인스턴스를 반환할 메서드 getInstance()는 static으로 정의될 수밖에 없다. 그래야 클래스를 인스턴스화하지 않고 바로 클래스명에서 해당 메서드에 접근할 수 있기 때문이다. Singleton.getInstance() 와 같이 말이다. 그리고 이 static 메서드 내부에서 싱글톤 인스턴스를 참조하는 변수 sglt를 사용하기에 해당 변수도 static으로 선언되어야 하는 것이다.


References

[1] 신용권, “혼자 공부하는 자바”, (한빛미디어, 2024)

This content is licensed under CC BY-NC 4.0

댓글남기기