몰입하며 나아가는 개발이란

Architecture, Desgin Pattern

Singleton Pattern (싱글톤 패턴)

류하을 2019. 12. 11. 22:41

Singleton Pattern이란

생성자를 최대한 줄이면서 객체 또는 필드값을 주고 받기 위한 클래스이다.

Singleton의 생성자는 private로 정의해야하며,

Private static 싱글톤클래스명 객체명 = null; 을 필드값으로 둠으로써

주고받을 인스턴스를 필드값으로 정의한 후, 싱글톤클래스 객체가 계속 동일한것을 활용하여

서로다른 여러 클래스에서 각각 싱글톤인스턴스만 호출하여도  여러 클래스의 Communication 이 가능하게 해주는 역할을 한다.

Singleton Class

public class Singleton {
	
	private static Singleton single = null;
	public int num; // 기본자료형 int를 주고받는을 수 있는 필드값.
	public String name; // 자료형 String을 주고받을 수 있는 필드값.
	
	private Singleton() {
	}
	
	public static Singleton getInstance() {
		if(single == null) {
			single = new Singleton();
		}
		return single;
	}
}

Other Class 1

import single.Singleton;

public class MyClass {

	private int myNum;
	private String myName;

	public MyClass() { // 생성과 동시에 필드값을 생성하며, 싱글톤에 필드값을 넘겨주는 생성자.
		myNum = 333;
		Singleton single = Singleton.getInstance();
		single.num = myNum;
	}
	
	public void MyMethod() { // 필드값 myName을 출력하는 메소드
		Singleton si = Singleton.getInstance();		
		myName = si.name;
		
		System.out.println("myName = " + myName);
	}
}

Other Class 2

import single.Singleton;

public class YouClass {

	private int youNum;
	
	public void method() { // YouClass의 필드값을 출력하는 메소드.
		Singleton single = Singleton.getInstance();
		youNum = single.num; // 싱글톤의 num을 필드값으로 저장함.
		
		System.out.println("youNum = " + youNum); 
	}
}

Other Class 3

import single.Singleton;

public class HeClass {

	private String name;
	
	public HeClass() { // 생성과 동시에 필드값을 정의, 싱글톤에 필드값을 전달 하는 생성자.
		name = "이몽룡";
		
		Singleton s = Singleton.getInstance();
		s.name = name;
	}
}

MainClass 

public class mainClass {

	public static void main(String[] args) {
		/*
			Singleton pattern 
			단 1개의 instance만을 이용해서 접근하는 패턴
		*/
		
		MyClass mcls = new MyClass();
		YouClass ycls = new YouClass();
		HeClass hcls = new HeClass();
		
		ycls.method();
		mcls.MyMethod();
        
        // console result //
        /*
         * youNum = 333
         * myName = 이몽룡
         */
         
        // commentary //
        /*
         * Other Class 3가지를 생성만 하였을 뿐이지만
         * Singleton Class 로 인해 Communication 을 하여
         * 필드값을 출력하게 되었다.
         */
        
	}

}

예제

1. 싱글톤 클래스를 활용하여, 기본자료형이 아닌 제네릭 클래스도 주고 받는것이 가능하다. 구현해보자.

 

Singleton Pattern 장점과 단점

static 으로 선언된 singleton 객체는 한번의 생성으로 고정된 메모리 영역을 사용하기 때문에,

여러클래스에서 인스턴스를 주고 받기 위해 생성자를 무분별하게 생성하는것 보다 메모리 낭비가 적으며,

singleton 객체는 전역 인스턴스 이기 때문에 어디서든 호출이 가능한 장점이 있다.

 

singleton 인스턴스를 무분별하게 사용할 경우 클래스간의 의존성이 높아지게되며,

나아가 캡슐화, 은닉성을 잃게되어 객체 지향 설계에 맞지 않게 된다. 즉, 재사용성이 떨어지게된다.

또한 MultiThread 환경에서 동기화처리를 하지 않게 되면 문제가 발생할 수 있으므로, 동기화처리가 필요하다.