[JAVA] 싱글톤 패턴(SingleTon Pattern)
싱글톤 패턴이란?
우리가 개발을 하면서 마주치는 문제점들은 과거에 이미 누군가가 해결했을 가능성이 높다.
흔히 발생하는 문제들이라면 그에 응당하는 해결책이 있는데
그 해결책들을 모아서 정의한것을 디자인 패턴(Design Pattern)이라고 한다.
이 디자인 패턴은 총 23가지로 정리되는데 그 중 하나가 싱글톤 패턴(Singleton Pattern)이다.
싱글톤 패턴을 사용하는 이유
프로그램 전역에서 사용되는 유일한 클래스를 만들기 위해 사용하는데 이해하기 쉽게
객체 인스턴스가 오로지 한개만 생성되도록 설계하는 패턴이라고 말할 수 있다.
목적
ㆍ고정된 메모리 영역을 가지고 하나의 인스턴스만 사용하기 때문에 메모리 낭비를 방지할 수 있다.
ㆍ싱글톤 클래스의 인스턴스는 전역에 사용될 수 있기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
핵심
// 기본 생성자
private 클래스(){
};
위의 소스코드에서 확인할 수 있듯이 싱글톤 패턴의 핵심은
싱글톤 클래스의 기본 생성자에 private 접근제어자를 붙여줘야 한다는 것이다.
그렇게 해야 여러 클래스에서 중구난방으로 이 객체를 생성하는 것을 막을 수 있기 때문이다.
코드
public class 클래스명 {
private static 클래스명 singleton = null;
// 기본 생성자의 접근 제어자는 private
private 클래스명() {
}
// public static으로 객체를 생성하지 않고 전역에서 호출할 수 있는 메소드
public static 클래스명 getInstance(){
if(singleton == null) {
singleton = new 클래스명();
} return singleton;
}
} // end of class
ㆍ타입이 클래스 자신인 인스턴스 변수를 선언하고 null 값으로 초기화한다.
ㆍ아무데서나 마구잡이로 객체를 생성할 수 없도록 기본 생성자에는 private 접근 제어자를 붙인다.
ㆍ어디에서나 객체 생성 없이 호출할 수 있도록 public static을 붙인 getInstance() 를 선언한다.
ㆍ만약, getInstance()를 호출 했을 때 singleton 변수의 값이 null이면(객체가 생성되지 않았으면)
객체를 생성해서 singleton 변수가 객체의 주소값을 가리키게 한다.
ㆍ만약, 이전에 누군가 다른 클래스에서 getInstance()를 호출해서 객체를 생성한적이 있다면
이 메소드는 그 객체의 주소값을 넘겨준다.
그림
실행
다음과 같은 싱글톤 클래스가 있다고 가정하자.
클래스 안에는 앞서 기술했던 것처럼 인스턴스 변수는 private static 접근제어자를 붙여주고
기본 생성자에는 private, 그리고 전역에서 호출할 수 있도록 static 메소드인 getInstance()를 선언하고 구현했다.
다른 클래스에서 Singleton 객체를 생성하려고 하면 위와 같이 컴파일 에러가 발생하는 것을 확인할 수 있다.
콘솔을 통해 두 변수의 주소값을 확인해본 결과 같은 객체를 가리키고 있는 것을 확인할 수 있다.
이로써, 싱글톤 패턴을 사용하는 이유와 구현에 대해 알아보았다.