싱글톤

서현서현·2022년 4월 20일
0

JAVA

목록 보기
18/27
post-thumbnail

SingleTon(싱글톤)

  • 객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다.
  • 최초한번의 new를 이용하기 때문에 메모리낭비를 방지하고 속도가 빠르다.
  • 데이터 공유가 쉽다. 싱글톤 인스턴스는 전역으로 사용된다.

SingleTon Class를 구성하는 방법

  1. 자기자신 class의 참조변수를 멤버변수로 선언한다. (이 변수는 private static으로 지정한다)
  2. 생성자를 private으로 한다. (외부에서 생성자에 접근을 못하게 하기 위해서 즉, 외부에서 new명령을 사용하지 못하게 하기 위해서)
  3. 객체(인스턴스)는 내부에서 생성해서 이 생성된 객체를 반환하는 메서드를 만든다. (이 메서드의 이름은 보통 getInstance()로 지정한다. 이 메서드는 static으로 지정한다)

예제

싱글톤 테스트

public class MySingleton {
	private static MySingleton single;
	
	private MySingleton() {
		// cf. enum도 접근제어자가 private이었음..
	}
	
	public static MySingleton getInstance() {
		if (single==null) {
			single = new MySingleton();
		}
		return single;
	}
	
	// 나머지  내용들은 이 클래스로 처리할 내용들을 기술한다.
	public void displayText() {
		System.out.println("난 싱글톤패턴의 객체!");
	}
}
public class SingletonTest {
	
	public static void main(String[] args) {
		// MySingleton test1 = new MySingleton(); //new명령 사용 불가
	
		// getInstance() 이용하여 객체 생성
		MySingleton test2 = MySingleton.getInstance();
		test2.displayText();
		MySingleton test3 = MySingleton.getInstance();
		
		System.out.println("test2 = "+test2);
		System.out.println("test3 = "+test3);
		
	}

}

같은 객체를 참조한다!

멤버를 싱글톤으로 활용하기

public class MemberDaoImpl implements IMemberDAO{
	
	private static IMemberDAO memDAO;
	
	private Connection conn;
	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	//외부에서 new 못함
	private MemberDaoImpl() {
		// TODO
	}

	public static IMemberDAO getInstance() {
		if(memDAO == null) {
			memDAO = new MemberDaoImpl();
		}
		return memDAO;
	}
public class MemberServiceImpl implements IMemberService{

	private static IMemberService memService;
	private IMemberDAO memDAO;
	
	private MemberServiceImpl() {
		memDAO = MemberDaoImpl.getInstance();
	}
	
	public static IMemberService getInstance() {
		if(memService == null) {
			memService = new MemberServiceImpl();
		}
		
		return memService;
}
public class MemberInfoMain {
	
	private IMemberService memService;
	private Scanner scan = new Scanner(System.in); 
	
	public MemberInfoMain() {
		memService = MemberServiceImpl.getInstance();
	}

0개의 댓글