우당탕탕 개발_𝒍𝒐𝒈

singleton 패턴 본문

대외 활동/데브코스

singleton 패턴

hojeong01 2024. 7. 20. 18:13

싱글톤 패턴이란?

하나의 클래스에 오직 하나의 인스턴스를 만들고 그것을 계속 재사용하는 패턴이다. 

 

보통 데이터베이스 모듈에 많이 사용한다고 한다.

오늘은 강의 시간에 배운 내용 +a으로 정리하고

데이터베이스 진도를 본격적으로 나간다면 싱글톤 패턴이 어떤 식으로 적용되는지 다시 한번 알아볼 예정이다.

 

다시 본문으로 돌아와서.. 

그럼 싱글톤 패턴을 적용하기 위해 우리가 생각해야 하는 조건들에는 무엇이 있을까? 

1. 재사용을 위해서는 '공유'(static)의 개념이 필요하다. 

2. 다른 곳에서 함부로 new를 통해 새로운 객체를 생성할 수 없도록 제한(private)을 해야 한다. 

3. 따라서 다른 곳에서 싱글톤 패턴이 적용된 객체를 호출하기 위한 메서드가 필요하다!

 

그럼 위 조건에 맞춰 코드를 작성해 보자! 

public class Singleton {
    private static Singleton singletonObject;

    private Singleton(){
    }
    
    public static Singleton getSingletonObject(){
        if(singletonObject==null){
            singletonObject = new Singleton();
        }
      return singletonObject;
    }
    
}

 

  • 싱글톤 객체를 담을 static 변수를 생성한다.
  • 다른 곳에서 함부로 new를 통해 새로운 객체를 생성할 수 없도록 private 타입의 기본 생성자를 만든다. 
  • 만약 singletonObject가 비어있다면 객체를 생성하고 이를 리턴하는 메서드를 선언한다. 

여기서 잠깐! 아직 static을 왜 적어주었는지 모르겠는 사람은 아래 블로그글에서 static에 대해 공부하고 오자!

2024.02.13 - [대외 활동/데브코스] - static에 대해서

 

static에 대해서

우선 static을 관리하는 메모리는 어디인지 그림으로 보고 넘어가자!자바의 메모리 구조Method 영역 : 클래스의 정보, static 영역, 상수 풀을 보관하는 영역, 프로그램을 실행하는 데 필요한 공통데

hojeong016.tistory.com


그럼 지금까지 싱글톤패턴을 적용하기 위한 방법에 대해 알아보았으니

마지막으로 main 메서드에서 서로 이름이 다른 싱클톤 타입의 객체 2개를 만들어 정말 하나의 인스턴스를 공유하는지 알아보자

 

참고로 new를 통해 객체를 생성하려고 하면 바로 빨간 줄이 그어지는 걸 확인할 수 있다!

 

 

singleton1과 singleton2 모두 하나의 참조값을 가진다는 것을 확인할 수 있다! 

 


번외 

싱글톤 패턴을 사용하여 객체를 생성하는 또 다른 방식 

public class Singleton {
    private static final Singleton singletonObject = new Singleton();

    private Singleton() {
    }

    public static Singleton getSingletonObject() {
        return singletonObject;
    }
}

 

이 방식은 프로그램의 시작 지점에서 객체가 생성되는 방식이다. (이른 초기화)

만약 반드시 위 객체를 생성해야 한다면 위 방식을 통해 여러 스레드에서 동시에 객체가 생성하면서 발생하는 문제들을 예방할 수 있다.  

하지만 객체가 너무 무겁고... 무조건 위 객체가 사용된다는 확신이 없을 때에는 자원의 낭비가 발생할 수 있으므로 잘 판단해서 사용하는 것을 추천한다.