아무거나

싱글턴 패턴(Singleton Pattern) 본문

Java & Kotlin/Java

싱글턴 패턴(Singleton Pattern)

전봉근 2019. 8. 9. 11:25
반응형

[싱글턴 패턴]

싱글턴 패턴(Singleton Pattern)이란 어떤 클래스의 인스턴스는 오직 하나임을 보장하며, 이 인스턴스에 접근할 수 있는 전역적인 접촉점을 제공하는 패턴

 

지금까지의 클래스를 잘 생각해 보면, 클래스를 하나 만들고, 만들어진 클래스로부터 객체를 여러 개 생성하여 사용하였습니다. 하지만 싱글턴 패턴을 이용하면,

클래스 하나에 객체를 유일하게 하나만 생성하여 모든 곳에서 하나의 객체에만 접근할 수 있습니다. 즉 전역의 개념으로 객체를 사용할 수 있다.

 

** static이나 클래스가 선언되는 위치를 데이터 영역이라하고 그 클래스들이 생성한 객체들이 위치하는 영역을 heap영역 이라한다.

 

예제로 소스파일을 실행시켜 확인하자.

[MainClass.java]
public class MainClass {
    public static void main(String[] args) {
        FirstClass firstClass = new FirstClass();
        SecondClass secondClass = new SecondClass();
    }
}

 

[SingletonClass.java]
public class SingletonClass {
    // 내가 나를 생성하여 나한테 다시 할당해준다.
    // SINGLETON_CLASS_INSTANCE : 데이터 영역
    // new SingletonClass() : heap 영역
    private static SingletonClass SINGLETON_CLASS_INSTANCE = new SingletonClass();
    public int i = 10;

    // private 접근제어자이므로 내부에서만 이 클래스를 생성할 수 있다.
    // 생성자를 생성할 수 없다는것은 즉, 객체를 만들 수 없다는 것이다.
    // 그러므로 객체가 생성되기 전에(클래스 단계) 바로 호출을해서 그 getSingletonClass에서
    // 자기 자신을 생성해서 돌려줘야 한다.
    private SingletonClass() {
        // TODO Auto-generated constructor stub
    }

    // 해당 메소드는 싱글턴클래스를 반환한다(본인)
    // 외부에서 public으로 접근해서 사용할 수 있는데 static이므로 객체가 생성되기전에도 바로 사용할 수 있다.
    // 그러므로 getSingletonClass를 호출하면 바로 SingletonClass를 리턴받을 수 있다.
    public static SingletonClass getSingletonClass() {
        // 싱글톤 클래스가 null일때는 싱글톤 클래스 객체를 만들어서 그 객체가 갖고있는 메모리의 주소값을
        // 클래스 영역에 있는 static변수 싱글톤클래스인스턴스에 할당
        if(SINGLETON_CLASS_INSTANCE == null) {
            SINGLETON_CLASS_INSTANCE = new SingletonClass();
        }

        // null이 아닐경우는 싱글톤클래스인스턴스를 바로 반환한다.
        return SINGLETON_CLASS_INSTANCE;
    }

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }
}

 

[FirstClass.java]
public class FirstClass {
    public FirstClass() {
        // SingletonClass singletonClass = new Single... 이런식으로는 사용이 불가능하다.
        // 이유는 생성자 접근제어자가 private이기 때문이므로 아래처럼 사용하자
        SingletonClass singletonClass = SingletonClass.getSingletonClass();
        System.out.println("FirstClass");
        System.out.println("i = " + singletonClass.getI());
        singletonClass.setI(200);
        System.out.println("i = " + singletonClass.getI());
    }
}

 

[SecondClass.java]
public class SecondClass {
    public SecondClass() {
        SingletonClass singletonClass = SingletonClass.getSingletonClass();
        System.out.println("SecondClass");
        System.out.println("i = " + singletonClass.getI());
    }
}

 

* 결과

FirstClass

i = 10

i = 200

SecondClass

i = 200

 

// 즉 외부에서 하나의 객체만 공유해서 쓸 수 있는것이 싱글턴 패턴이라고 한다.​ 

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

String의 이해  (0) 2019.08.12
스트레티지 패턴  (0) 2019.08.12
인터페이스  (0) 2019.08.08
추상클래스(abstract)  (0) 2019.08.08
super 키워드  (0) 2019.07.04
Comments