728x90

Singleton Design Pattern is basically used when we want to limit object creation.
최초 한번만 메모리를 할당하고(static) 그 메모리를 인스턴스로 만들어 사용하는 디자인 패턴.
싱글톤(singleton)은 단독 객체라는 의미를 가진 영단어로, 단 하나의 객체만 만들어야 할 경우 필요하다.
싱글톤 패턴은 하나의 인스턴스만을 재사용하게 된다. 따라서 객체를 여러 번 생성할 필요가 없는 경우에 싱글톤을 사용하면 불필요한 자원 낭비나 오버헤드 등을 막을 수 있다.


class 클래스  {

    // 정적 필드

    // 자신의 클래스 타입으로 정적(static) 필드를 선언하고 자신의 인스턴스를 생성하여 초기화를 한다.

    // 전역 변수로 instance를 만드는데 private static을 이용한다.

   // static 는 이 객체를 사용하는 모두에게 이 값을 동일시 하겠다는 의미다.

    private static 클래스 instance = new 클래스(); // ② class 외부에서 값을 변경할 수 없도록 private 를 붙인다.


    //생성자   

    private 클래스 (){  // ① 외부에서 new 연산자로 생성자를 호출할 수 없도록 private 를 붙인다.
       
    }


    // 정적 메소드

    public static 클래스 getInstance(){ // ③ 외부에서 호출이 가능한 정적 메소드인 getInstance()를 정의한다.
        return instance; // ④ 정적 필드에서 참조하고 있는 자신의 객체를 리턴하도록 한다.
    }
   

}


- 여기서 클래스명 = Singleton 으로 가정한다.

- 생성자의 접근 제어자를 private로 하면, Class 외부에서 new 키워드를 사용할 수 없게 된다.

  즉, Singleton 클래스를 외부에서 호출할 수 없다.

  Singleton singeton = new Singleton(); // 에러 (외부에서 생성자에 접근할 수 없으므로 인스턴스 생성불가)

  클래스 내부에서는 인스턴스의 생성이 가능하다.

- 생성자의 접근 제어자를 public로 하면, Class 외부에서 new 키워드를 사용할 수 있게 된다.
  Singleton singleton1 = new Singleton();
  Singleton singleton2 = new Singleton();
  서로 다른 new 연산자로 인해서 객체가 생성이 되었기 때문에 서로 다른 메모리를 할당받게 된다.

- 외부에서 호출이 가능한 정적 메소드인 getInstance()를 정의한다.
  이때 정적 필드에서 생성한 인스턴스를 리턴값으로 돌려준다.
  Singleton singleton1 = Singleton.getInstance(); // 싱글톤 인스턴스 호출
  Singleton singleton2 = Singleton.getInstance(); // 싱글톤 인스턴스 호출
  if(singleton1 == singleton2){
      System.out.println("두 객체는 같습니다.");
  } else {
      System.out.println("두 객체는 다릅니다.");
  }

- 안드로이드 앱은 각 액티비티나 클래스 별로 주요 클래스들을 일일이 전달하기가 번거롭기 때문에 싱글톤 클래스를 만들어서 접근하도록 설계하는 것이 편하다.
  하지만 주의하자. stakoverflow 게시글 https://stackoverflow.com/questions/26882594/static-singleton-class-memory-leak-in-android 을 보면 99.9%는 안전하지만, If you call getInstance() from two different threads can happen that you instantiate Singleton twice.


'안드로이드 > Java 문법' 카테고리의 다른 글

자바 Arraylist  (0) 2019.05.26
Java BubbleSort  (0) 2019.05.13
[Java] instanceof 연산자  (0) 2017.10.24
Java static 변수 이해하기  (0) 2017.10.20
[Java] 정보은닉과 캡슐화  (0) 2017.10.16
블로그 이미지

Link2Me

,