자바 싱글톤 패턴 기초 | 자바 입문강좌 24

자바 싱글톤 패턴 기초

static 메소드에 대한 챕터에서 다뤄야할 내용이었는데 디자인패턴은 TMI인 것 같아서 약간 뒤로 미뤘습니다.

싱글톤 패턴은 디자인패턴의 하나로 디자인 패턴(Design Pattern)은 일반적 객체지향프로그래밍의 설계 이론 입니다. 싱글톤 패턴은 간단하면서도 쓸모가 많아서 실무에서도 사용됩니다.

디자인 패턴에 관한 설명을 여기서 하려는게 아니라 객체지향에서 static 의 사용법의 하나로써 소개하는 것 입니다. 프레임워크 등 외부 라이브러리를 사용하다 보면 자주나오기 때문에 알고 있어야 합니다.

자바 싱글톤 패턴
자바 싱글톤 패턴

싱글톤 예제

이번에는 기초 예제 하나로 퉁치고 가겠습니다.

코드가 또 길어보이지만 챕터 23까지의 내용들이 들어있을 뿐 입니다.

public class Main {
    public static void main(String[] args) {

        mySingleton inst1 = mySingleton.getInstance();
        mySingleton inst2 = mySingleton.getInstance();
        System.out.println(inst1);
        System.out.println(inst2);
        System.out.println("인스턴스가 같은건지 비교");
        System.out.println(inst1 == inst2);

//        getter와 setter 사용
        System.out.println(inst1.getId());
        System.out.println(inst1.getName());

        inst1.setId(2005);
        inst1.setName("The New Manager");

        System.out.println(inst2.getId());
        System.out.println(inst2.getName());
    }
}
class mySingleton{
    private int id;
    private String name;

    private static mySingleton instance = new mySingleton();
    private mySingleton(){
        this.id = 1001;
        this.name = "The Instance Manager";
    }
    public static mySingleton getInstance(){
//        인스턴스는 한개 이상 생성이 불가능하다.
        if(instance == null){
            instance = new mySingleton();
        }
        return instance;
    }
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}

결과값을 보기전에 설명하겠습니다. 우선 class 안의 모든 멤버변수와 생성자 static 메소드가 private이고 한개의 static 메소드만 public 으로 인스턴스를 생성할 수 있습니다. getter와 setter는 당연히 public 이겠죠? 이것도 하나로 묶을 수는 있으나 인텔리제이에서 generate 하면 위와 같은 표준코드를 생성합니다.

생성자를 보면 instance 는 항상 한개만 유지되야합니다. 추가적으로 인스턴스를 생성하려는 시도는 if 조건문으로 필터링을 합니다.

com.kay.mySingleton@7ef20235
com.kay.mySingleton@7ef20235
인스턴스가 같은건지 비교
true
1001
The Instance Manager
2005
The New Manager

이 클래스의 특징은 런타임 동안 단 한개의 인스턴스만 허용이되며 이 인스턴스를 조작할 수 있는 메소드는 getter와 setter 밖에 없습니다. 이 클래스를 사용하는 사람이 할 수 있는 일이 정해져 있으므로 프로그램 오류나 메모리 유출 등 문제가 줄어듭니다.

굳이 여러개의 인스턴스를 사용할 필요가 없는 경우 싱글톤으로 사용합니다. getInstance() 라는 메소드를 보면 어떤 객체를 반환합니다. 우리가 인스턴스를 생성할 때 new 클래스() 이렇게 들어가는데 어떻게 보면 이것도 new 라는 키워드를 사용함으로써 마음대로 메모리를 사용할 수 있도록 허용된 것 입니다.

즉 싱글톤은 new 라는 키워드를 사용할 원천 자체를 차단해버리므로, 클래스의 사용자는 훨씬 편하게 프로그래밍을 할 수 있다는 말입니다.

new는 원래 C언어의 malloc () (Memory Allocation) 메모리 할당 함수에다가 객체 관리 기능을 추가해서 나온 키워드입니다.

프로그래밍에서 가장 힘들게 하는 것은 메모리에 직접 손을 대는 일 입니다. 물론 자바는 Managed Language (매니지드 언어) 로써 JVM(자바가상머신)의 GC(Garbage Collector – 쓰레기 수거인) 가 알아서 메모리를 관리합니다. 초기와 다르게 현재는 매우 고성능입니다. 자바로 만든 안드로이드 어플을 보면 고사양 게임도 쌩쌩 잘 돌아갑니다.

허나 역시 new 도 메모리 할당이기 때문에 이것 조차 굳이 안쓸 수 있다면 사용자에게 막아 놓자. 이라는 좋은 생각입니다.

싱글톤 패턴의 외부 라이브러리를 쓸 때는 이 점을 염두해 두면 적응하는데 도움이 됩니다.

요약

자바 싱글톤 패턴의 기초적 맛만 봤습니다. 소스 코드를 돌려 보면 무슨 말인지 쉽게 감을 잡을 수 있습니다. 디자인 패턴은 말 그대로 패턴이기 때문에 다른 방법으로도 응용이 가능합니다.

코드를 따라서 실습하는 것에 그치지 않고 자신만의 싱글톤 패턴 클래스를 만들어 본다면 실력도 일취월장할 것 입니다.

외부참조문서

Design Pattern – 자바 싱글톤 패턴 – Tutorialspoint

Java Singleton Design Pattern Example Best Practices – JournalDev

Leave a Comment