drexqq

[Java, 자바] Singleton(싱글톤) 본문

Back-End/Java

[Java, 자바] Singleton(싱글톤)

drexqq 2020. 6. 10. 20:13
728x90
반응형

Java의 Design Pattern중 하나인 Singleton(싱글톤)에 대해서 알아보자.

 

Singleton을 설명하기 위해서 예제를 하나 보겠다.

 

public class a {
    public a() {
        System.out.println("a Instance  create");
    }
}

 일단 기본적으로 클래스 a를 생성해주었다.

 

너무 성의없게 만들었다.. 죄송합니다..

 

public class Singleton {
    private static Singleton singleton = new Singleton();
    
    private Singleton() {
        System.out.println("Singleton Instance create");
    }
    public static Singleton getInstance() {
        return singleton;
    }
}

 

그리고 이번에 알아볼 Singleton클래스를 생성해주었다.

 

Singleton 클래스를 만들 때 중요한 부분은 바로 생성자 부분이이다.

 

대부분 생성자를 만들 때 public으로 선언하는데, Singleton 패턴에서는 private로 선언을 해주어야 한다.

 

접근제어자를 private으로 생성자를 만들어놓으면 new 연산자에 제약이 생긴다.

 

다시말해 객채를 다른곳에서 생성할 수 없다는 뜻이 된다.

private static Singleton singleton = new Singleton();

그렇게 때문에 이 부분에서 정적으로 객체를 선언해 주었다.

 

이렇게 생성한 객체는 아래 static메서드인 getInstance를 사용하여 반환할 수 있다.

 

또한 Singleton 클래스는 다른 클래스에서 new연산자를 이용하여 생성할 수 없기 때문에 한 번 생성이 된 뒤로는 몇 번을 getInstance로 불러오더라도 항상 같은 값을 return하게 된다.

 

public class Main {
    public static void main(String[] args) {
        a a1 = new a();
        a a22 = new a();
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
    }
}

이제 메인 클래스에서 확인을 해보면 아래와 같은 결과가 나온다.

 

a Instance create

a Instance create

Singleton Instance create

 

차이가 보인다. 앞서 작성한 a클래스에서는 생성자를 두 번 생성해주었을 때 두 번 모두 생성이 되었다는 문구가 나왔고, 그에 반해 Singleton클래스는 한 번만 생성이 되었다는 문구가 나왔다.

 

이와 같이 Singleton클래스를 사용하여 만든 객체는 항상 서로 같다는 사실을 알 수 있다.

 

 

Singleton의 사용 이유

 

1. 고정된 메모리 영역을 사용하도록 단 한번 new 연산자로 인스턴스를 얻어오기때문에 메모리의 낭비를 줄인다.

2. static변수로 선언되고 static메서드로 호출 하기 때문에 다른 클래스에서 사용하기 쉽다.

3. 공통된 객체를 사용해야하는 코딩에서 매번 객체를 생성하지않고 같은 객체를 사용하도록 하면 성능면에서 좋다.

 

728x90
반응형

'Back-End > Java' 카테고리의 다른 글

[Java, 자바] Observer  (0) 2020.06.17
[Java, 자바] Factory Pattern(팩토리패턴)  (0) 2020.06.11
[Java, 자바] 스택(Stack), 큐(Queue)  (0) 2020.06.10
[Java, 자바] HashMap, TreeMap  (0) 2020.06.10
[Java, 자바] Iterator  (0) 2020.06.09
Comments