JAVA/java 이론

[자바JAVA] 싱글톤 디자인 패턴

자바칩 프라푸치노 2020. 10. 20. 17:27

1. 싱글톤

- 자바의 디자인 패턴

- 하나의 애플리케이션 내에서 단 하나만 생성되는 객체

외부에서 new연산자로 인스턴스 생성할 수 없도록 private 접근 제어자를 붙임

 

2. 예제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package sec07_exam;
 
public class Singleton {
 
    //접근제어자 범위가 가장 좁은 범위의 제어자이기 때문에 외부에서 접근을 못한다.
    private static Singleton singleton = new Singleton();
    
    //싱글톤 패턴은 그 핵심이 하나의 인스턴스를 공유하는 것이다.
    //하여, 생성자에 private를 통해서 외부에서 싱글톤 객체의 생성을 막는다.
    private Singleton() {
        System.out.println("생성자 호출");
    }
    
    
    //getInstance()하는 역할?
    //공유변수의 주소만 리턴해주므로써 싱글톤 객체를 사용하게끔 해준다.
    public static Singleton getInstance() {
        return singleton;
    }
}
 
cs

 

싱글톤은 자신을 정적 필드로 선언하고 객체 생성해줍니다.

그리고 외부에서 접근 못하도록 private를 붙여줍니다.

그리고 외부에서 호출할 수 있도록 public메서드인 getInstance를 만들어줍니다.

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package sec07_exam;
 
import java.util.Calendar;
 
public class SingletonEx {
 
    public static void main(String[] args) {
        
        //Singleton클래스의 기본생성자를 private로 설정했기 때문에
        //기본 생성자 호출이 안된다.
        //Singleton s1 = new Singleton();
        
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        //Calendar 클래스는 싱글톤 패턴이아니다. 그냥 흉내를 낸 것이다.
        Calendar calendar1 = Calendar.getInstance();
        Calendar calendar2 = Calendar.getInstance();
        
        
        if (s1==s2) {
            System.out.println("같은 주소를 가지는 싱글톤 객체입니다!");
            System.out.println("s1의 주소 : " + s1);
            System.out.println("s2의 주소 : " + s2);
        }
        else {
            System.out.println("다른 주소를 가지는 싱글톤 객체입니다!");
            System.out.println("s1의 주소 : " + s1);
            System.out.println("s2의 주소 : " + s2);
        
        }
        if (calendar1==calendar2) {
            System.out.println("같은 주소를 가지는 싱글톤 객체입니다!");
            System.out.println("calendar1의 주소 : " + calendar1);
            System.out.println("calendar2의 주소 : " + calendar2);
        }
        else {
            System.out.println("다른 주소를 가지는 싱글톤 객체입니다!");
            System.out.println("calendar1의 주소 : " + calendar1);
            System.out.println("calendar2의 주소 : " + calendar2);
        
        }
        
    }
 
}
 
cs

싱글톤 객체를 사용하려면 getInstance메서드를 사용해야합니다.

이 객체는 하나이고 getInstance로 그 객체의 주소를 참조하고 있으므로

싱글톤타입 객체는 모두 같은 주소를 가집니다.

 

예시로 Calendar도 만들어봤는데.

싱글톤 패턴은 아니지만 getInstance를 쓴다는 점에서 비슷합니다.

 

<출력결과>

728x90