본문 바로가기
Dev/Java

싱글톤 (Singleton)

by vellahw 2022. 9. 16.

 

 

전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우가 있는데,

단 하나만 생성된 이 객체를 싱글톤이라고 한다.

 

싱글톤을 이용하는 이유는 최초 한번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지할 수 있기 때문이다. 뿐만 아니라 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점이 있다고 볼 수 있다.

또다른 이점은 다른 클래스 간에 데이터 공유가 쉽다는 것인데 싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용할 수 있다. 

(이점 출처:https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/)

 


 

생성자를 호출한 만큼 객체가 생성되기 때문에 싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 생성자 앞에 private  접근 제한자를 붙여 접근을 막아야한다.

그리고 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화 해주어야 한다.

정적 필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 막는다.

대신 외부에서 호출할 수 있는 정적 메소드인 getInstance()를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴해준다.

 

public class 클래스 { 
	//정적 필드 
	private static 클래스 singleton new 클래스() ; 
	//생성자 
	private 클래스() {} 
	//정적 메소드 
	static 클래스 getInstance() { 
		return singleton; 
    }
}

▲싱글톤을 만드는 코드

 

외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 방법이다.

getInstance() 메소드는 단 하나의 객체만 리턴하기 때문에 아래 코드에서 변수1과 변수2는 통일한 객체를 참조한다.

클래스 변수1 = 클래스.getInstance(); 
클래스 변수2 = 클래스.getInstance();

 

▼예제

public class Singleton { 
	private static Singleton singleton = new Singleton(); 
 
 	private Singleton() {} 
 
	 static Singleton getlnstance() { 
		 return singleton;
     }
}

 

public class SingletonExample { 
	public static void main(String[] args) { 
	/* 
	Singleton obj1 = new Singleton(); //컴파일 에러-외부에서 생성자 호출 불가능
	Singleton obj2 = new Singleton(); //컴파일 에러 
	*/ 
 
	Singleton obj1 = Singleton.getlnstance(); 
	Singleton obj2 = Singleton.getlnstance(); 
 
 	if(obj1 == obj2 ) { 
		System.out.println("같은 Singleton 객체입니다."); 
 	} else { 
		System.out.println("다른 Singleton객체 입니다.");
  	}
  }
}

출력 결과

 

 

'Dev > Java' 카테고리의 다른 글

JSTL - 코어 태그 <c:set>, <c:remove>  (0) 2022.09.21
표준 태그 라이브러리(JSTL)  (0) 2022.09.21
세션 session  (0) 2022.09.02
자바빈(JavaBean)  (0) 2022.09.02
include 디렉티브  (0) 2022.09.01

댓글