티스토리 뷰

반응형

요즘 스프링을 다시 기초부터 훓어보고 있다. 빈즈 Scope 부분을 보던 중에 싱글톤에 대한 개념이 나와 정리하기로 했다.

 

정리하기 전에, 여담이긴 하지만 싱글톤은 디자인패턴 중에 내가 가장 좋아하는 패턴이다.

대학교 때 토이프로젝트로 게임을 만들면서 어떠한 부분에서 구현이 막혔었다. 친구랑 같이 계속 고민했지만 답이 나오지 않아서 보류상태였는데, 어느 날 친구가 엄청 신나하면서 알려줬었다. 코딩을 잘하는 복학생한테 물어봤다고 했다. 

디자인패턴이라는 것을 알기 전이었어서 나도 덩달아 신나게 배웠었다. 패턴으로 어떠한 개념자체가 만들어지는 것 같아서 진짜 재밌게 배웠다.🤩 요즘은 주변에 개발의 즐거움을 나눌 사람이 없다는게 조금 쓸쓸하다..

 

다시 본론으로...

 

정의

싱글톤의 영어 사전 뜻은 아래와 같다.

singleton
  • 1(단독) 개체
  • 2독신자(결혼을 안 했거나 애인이 없는 사람)
  • 3(쌍둥이가 아닌) 외둥이[단일아

개체! 독신자🙋‍♀️

 

그리고, 위키에는 싱글톤 패턴이 다음과 같이 정의되어 있다.

소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.

 

싱글톤 패턴은 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 이로 인해, 메모리 낭비를 방지할 수 있고, 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다

 

사용

public class Singleton {
    // Eager Initialization
    private static Singleton uniqueInstance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
      return uniqueInstance; 
    } 
}

 private 생성자와 static 으로 getInstance()를 정의한다.

 

 

예제

싱글톤 패턴 사용예제를 아래 OCAJP 문제를 통해 보자!

 

Given: 
public class Customer {
  private String fName;
  private String lName;
  private static int count;
  public Customer(String first, String last) {
    fName = first;
    lName = last; 
    ++count;
  }
  static {
    count = 0;
  }
  public static int getCount() {
    return count;
  }
}
public class App {
  public static void main(String[] args) {
    Customer c1 = new Customer("Larry", "Smith");
    Customer c2 = new Customer("Pedro", "Gonzales");
    Customer c3 = new Customer("Penny", "Jones");
    Customer c4 = new Customer("Lars", "Svenson");
    c4 = null;
    c3 = c2;
    System.out.println(Customer.getCount());
  }
}

 

What is the result? 

A. 2

B. 3

C. 4

D. 5 

 

정답은 C이다. 예제에서 count는 싱글톤 패턴으로 정의되어 있기 때문에 아무리 지지고 볶고(?)해도 Customer() 생성자가 호출되는 수 만큼 0(초기화값)에서부터 ++count가 이루어져 4가 된다. 

 

 

또 다른 문제를 보자.

 

 

* You want to create a singleton class by using the Singleton design pattern. Which two statements enforce the singleton nature of the design? (Choose two.) 

A. Make the class static. 

B. Make the constructor private. 

C. Override equals() and hashCode() methods of the java.lang.Object class. 

D. Use a static reference to point to the single instance. 

E. Implement the Serializable interface. 

 

정답은 B, D 이다.

싱글톤 패턴의 공통적인 특징은 private constructor 를 가진다는 것과, static method 를 사용한다는 점이다.

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함