[JAVA] 싱글톤 패턴

보람·2023년 2월 1일
0

JAVA

목록 보기
11/24
post-thumbnail

(1) 디자인 패턴이란?

  • 반복적으로 일어나는 문제들을 해결할 수 있게함
  • "올바른" 설계를 "빠르게" 만들 수 있도록 도와줌

(2) singleton 패턴

  • 전역적인 범위를 갖는 객체를 생성해 여러곳에서 반복적으로 사용할 수 있도록 함
  • 여러곳에서 공유하는 객체를 만드는 클래스 작성 패턴

(3) singleton 객체의 이점

  • 공유기능 하나만 생성해도 프로그램 전역에서 재사용할 수 있어 메모리를 효율적으로 사용할 수 있다.
  • 단 한번만 객체를 생성하면 객체를 일일이 생성해야 하는 번거로움을 피할 수 있다.

(4) 싱글톤 객체를 생성하기 위한 준비

	public class Calc { 
		private static Calc current; // 
  • static이 쓰이는 이유

    • static이 적용된 자원은 메모리의 고정영역에 생성
    • 그러므로 클래스의 객체나 멤버변수, 메서드와는 메모리상에서 구별
    • Calc 클래스 안에 static 형태로 Calc 클래스의 객체를 정의하는 것은
    • 실제로는 Calc에서 독립된 객체가 되는 것
    • 코드상의 논리적인 연관관계를 위해 파일 한 개에서 정의하는 것 뿐임
  • private이 쓰이는 이유

    • Calc 클래스 외에 여러 곳에서 new 연산자를 사용하여 객체 할당이 가능하다면 SingleTon이라는 개념자체가 성립되지 않음
    • 외부에서 이 객체를 직접적인 접근을 못하도록 은닉시킨다.
        public static Calc getInstance() {
        // 외부에서 getInstance()로 반환
        if( current ==  null ) {
        // 초기값이 null이므로 최초로 호출된 경우
			current = new Calc();
		} // 객체 선언 1번
		return current;
	}	// 초기값이 null이 아니고
    	// 이미 호출된 경우엔 그대로 반환
        	public static void freeInstance() {
		current = null;
	} // 객체에 null을 대입하면 메모리에서 삭제된다.
  • current 객체를 private으로 지정하였기 때문에, 객체를 메모리에서 간접적으로 할당하고 삭제하기 위한 메서드가 필요

  • 객체를 메모리에서 제어하기 위해 null 사용

	public class Calc { 
		private static Calc current;
        public static Calc getInstance() {
		if( current ==  null ) {
			current = new Calc();
		}
		return current;
	}
    	public static void freeInstance() {
		current = null;
	}
	private Calc() { } // 싱글톤 객체 생성
  • 기본생성자를 private형태로 정의

    • 객체 생성자가 은닉 처리되어 외부에서의 new 연산자를 사용한 객체 할당이 금지된다.

예시

public class Calc {
	// ------싱글톤 객체를 생성하기 위한 준비 시작 -------------
	private static Calc current;
	public static Calc getInstance() {
		if( current ==  null ) {
			current = new Calc();
		}
		return current;
	}
	public static void freeInstance() {
		current = null;
	}
	private Calc() { }	
	// ----------싱글톤 객체를 생성하기 위한 준비 끝 ----------
    // ----------이 객체가 구현해야하는 기능 -----------------	
	public int plus(int x, int y) {
		return x + y;
	}
	public int minus(int x, int y) {
		return x - y;

(5) 싱글톤 객체 불러오기

  • getInstnace() 메서드를 사용하여 객체를 리턴받음
  • 여러개의 객체를 리턴 받더라도 모두 하나의 static 객체를 참조하므로 전역 객체 하나만 메모리에 할당
public class Main01 {

	public static void main(String[] args) {

		Calc c1 = Calc.getInstance();
		System.out.println( c1.plus(20, 10) );    
		
		// 참조처리를 생략하고 직접 사용하는 경우
		System.out.println( Calc.getInstance().minus(20, 10) );
	}
}
// 결과 : 30,10
profile
안녕하세요, 한보람입니다.

0개의 댓글