BACK-END/JAVA

[JAVA] 싱글톤 패턴(SingleTon Pattern)

썬키 2023. 2. 8. 22:45
싱글톤 패턴이란?

 

우리가 개발을 하면서 마주치는 문제점들은 과거에 이미 누군가가 해결했을 가능성이 높다.

흔히 발생하는 문제들이라면 그에 응당하는 해결책이 있는데

그 해결책들을 모아서 정의한것을 디자인 패턴(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()를 호출해서 객체를 생성한적이 있다면

이 메소드는 그 객체의 주소값을 넘겨준다.

 

그림

 

출처 : Youtube 한빛미디어

 

 

실행

 

 

다음과 같은 싱글톤 클래스가 있다고 가정하자.

 

클래스 안에는 앞서 기술했던 것처럼 인스턴스 변수는 private static 접근제어자를 붙여주고

기본 생성자에는 private, 그리고 전역에서 호출할 수 있도록 static 메소드인 getInstance()를 선언하고 구현했다.

 

Singleton 객체

다른 클래스에서 Singleton 객체를 생성하려고 하면 위와 같이 컴파일 에러가 발생하는 것을 확인할 수 있다.

 

getInstance() 호출

 

 

콘솔을 통해 두 변수의 주소값을 확인해본 결과 같은 객체를 가리키고 있는 것을 확인할 수 있다.

 

이로써, 싱글톤 패턴을 사용하는 이유와 구현에 대해 알아보았다.