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 |