[Java 디자인패턴]  static을 응용한 싱글톤 패턴(Singleton Pattern) 구현

클래스 내의 변수에 static 키워드를 붙이면 그 클래스의 인스턴스들이 공유하는 클래스 변수가 됩니다. 다음 예제를 봅시다. 사용자 클래스 User로 인스턴스를 생성할 때 마다 첫 번째 인스턴스에는 1001을, 두 번째 인스턴스에는 1002, 다음은 1003, ... 이런식으로 1000부터 시작해서 인스턴스를 생성할 때마다 1씩 증가시켜 id를 부여해주려고 합니다.

 

/*
사용자 클래스
 */
public class User {

    private static Long serialNumber = 1000L;
    private Long userId;
    private String userName;

    public User(String userName) {
        this.userName = userName;
        serialNumber++;
        this.userId = serialNumber;
    }

    public static Long getSerialNumber() {
        return serialNumber;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                '}';
    }

    public static void main(String[] args) {

        System.out.println(User.getSerialNumber());     // serialNumber: 1000

        User user1 = new User("김현정");
        System.out.println(User.getSerialNumber());     // serialNumber: 1001

        User user2 = new User("서지은");
        System.out.println(User.getSerialNumber());     // serialNumber: 1002

        User user3 = new User("박주영");
        System.out.println(User.getSerialNumber());     // serialNumber: 1003

        System.out.println(user1);
        System.out.println(user2);
        System.out.println(user3);
    }
}

 

User 클래스의 serialNumber 변수에 static 키워드가 붙어있습니다. 즉 serialNumber는 static 변수(클래스 변수)로써, User 클래스로 생성하는 모든 인스턴스가 공유하는 값이 됩니다. 1000번부터 시작할 것이므로 1000으로 초기화를 해두었습니다.

 

다음으로 중요하게 볼 것은 생성자입니다. 생성자는 객체를 생성할 때 마다 호출되지요.

그래서 생성자 안에 serialNumber를 1 증가하는 코드를 넣어주었습니다.

이제 User()가 호출될 때 마다 serialNumber는 1000부터 1씩 증가합니다.

 

그리고 serialNumber는 외부에서 수정할 수 없도록 private 접근제어자를 붙여주고 값을 받아갈 수 있도록 getter를 만들어주었습니다.

 

이제 main 메소드에서 User 인스턴스를 하나씩 만들며 확인해봅시다.

구상한 대로, 인스턴스를 생성할 때 마다 User 클래스의 serialNumber가 1씩 증가하고 각 인스턴스의 userId 변수에 증가된 serialNumber가 할당되었습니다.

 

???? 실행 결과

1000
1001
1002
1003
User{userId=1001, userName='김현정'}
User{userId=1002, userName='서지은'}
User{userId=1003, userName='박주영'}
1003

Process finished with exit code 0

 

싱글톤 패턴(Singleton Pattern)

이렇게 static 변수는 단순히 모든 인스턴스들이 공유하기 위한 변수를 만들기 위해서도 사용되지만 이러한 static 키워드의 특성을 이용한 디자인패턴이 싱글톤 패턴(Singleton Pattern) 입니다. 디자인 패턴은 객체지향 프로그래밍 언어로 프로그램을 설계할 때 효율적이고 유지보수가 용이하게 하기 위한 설계 기법입니다.

싱글톤 패턴은 하나의 프로젝트, 어플리케이션 안에서 단 한 개만 존재해야 하는 인스턴스를 생성해야 할 경우 사용할 수 있습니다.

 

어떤 클래스를 싱글톤 패턴으로 구현하는 방법은 다음 세 가지를 지키면 됩니다.

① private 생성자
② static 변수로 객체 생성
③ 객체의 getter 구현

클래스를 위와 같이 설계하면 인스턴스의 유일성이 보장됩니다.

 

어떤 프로젝트에서 상점 클래스 Store의 객체는 어플리케이션에서 단 한 개만 사용해야 한다고 가정해봅시다.

Store 클래스를 싱글톤 패턴으로 구현한 예제입니다.

 

public class Store {

    private static Store instance = new Store();

    private Store() { }

    public static Store getInstance() {
        return instance;
    }
}

public class StoreTest {

    public static void main(String[] args) {

        Store store1 = Store.getInstance();
        Store store2 = Store.getInstance();
        //Store store3 = new Store();   // 직접 생성 불가

        System.out.println(store1);
        System.out.println(store2);
    }
}

 

Store 클래스 내에 Store 타입의 static 변수 instance를 선언해서 객체를 생성해주었습니다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

여기서 생성한 객체는 static 메모리 영역에 할당되어 어플리케이션 전체에서 이 객체만을 유일하게 사용하게 됩니다.

왜냐면, 생성자의 접근제어자를 private으로 했기 때문에 Store 클래스 외부에서는 절대로 호출할 수 없기 때문입니다.

마지막으로 외부에서 사용할 수 있도록 Store 객체를 반환하는 static getter를 만들어줍니다.

 

StoreTest 클래스의 main 메소드에서 Store 인스턴스를 사용합니다.

new Store()와 같이 생성할 수 없고 Store의 getInstance()를 호출함으로써 Store 인스턴스에 접근할 수 있습니다.

 

???? 실행 결과

com.yoon._static.Store@2c8d66b2
com.yoon._static.Store@2c8d66b2

Process finished with exit code 0

 

store1, store2를 찍어보면 해시코드 값이 동일함을 알 수 있습니다.

즉, 두 변수는 같은 인스턴스를 참조하고 있습니다.

 

자바 API에서 싱글톤 패턴이 적용된 예로는 Calendar 클래스가 있습니다.

// Calendar calendar = new Calendar(); // 직접 생성 불가
Calendar calendar = Calendar.getInstance();

Calendar 클래스도 위에서 구현한 Store 클래스와 마찬가지로 싱글톤 패턴이 적용되어 있기 때문에 new 연산자로 생성이 불가능하며 Calendar의 static 인스턴스를 반환해주는 getInstance()를 호출해야 합니다.

 

 

이처럼 싱글톤 패턴은 직접 구현할 경우도, 적용되어 있는 클래스를 사용할 경우도 많은 디자인 패턴 중 하나입니다.

 

[출처] https://atoz-develop.tistory.com/entry/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4-static%EC%9D%84-%EC%9D%91%EC%9A%A9%ED%95%9C-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4Singleton-Pattern-%EA%B5%AC%ED%98%84

 

 

 

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
161 [Java 자료구조] JPA와 Spring Data JPA의 차이 file 졸리운_곰 2022.09.09 287
160 [java 자료구조] 하이버네이트 쉽게 입문하기 (기초)-환경설정,입력조회 개발 file 졸리운_곰 2022.09.09 251
159 [Java 자료구조] JPA, Hibernate, 그리고 Spring Data JPA의 차이점 졸리운_곰 2022.09.09 303
158 [Java][MyBatisc] myBatis에서 null과 nullString을 체크할 때 졸리운_곰 2021.09.13 242
157 [MongoDB/Java] MongoDB에 JSON 형식 데이터 삽입하기 file 졸리운_곰 2021.07.13 233
156 [Java, MongoDB] mongodb java driver 3.0: how to store JSON document 졸리운_곰 2021.07.13 208
155 [Java 자료구조] [Java] 문자열의 첫 글자 제거 졸리운_곰 2021.05.24 642
154 [Java 자료구조] [java] 특정 문자열 사이의 문자열 추출하기, 정규식 졸리운_곰 2021.05.24 2063
153 [Java 자료구조] [JAVA] Java언어로 JSON 생성, 파싱 예제 file 졸리운_곰 2021.05.17 189
152 [Java 자료구조] [Java] Immutable Class (불변 클래스) file 졸리운_곰 2021.03.07 224
151 [Java 자료구조] 불변 객체란? Java Immutable Object file 졸리운_곰 2021.03.07 185
150 [Java 자료구조] [Java] Immutable Object(불변객체) 졸리운_곰 2021.03.07 260
149 [java 자료구조] Oracle + Mybatis 환경에서의 Date 다루기 졸리운_곰 2021.02.25 234
148 Java JSON library Jackson Date Date Json 시리얼라이즈/디씨리얼라이즈 file 졸리운_곰 2021.02.25 190
147 [Java, JSON, jackson] Ignoring new fields on JSON objects using Jackson 졸리운_곰 2021.02.19 213
146 [Java] [Jackson] JsonInclude 속성에 대해 알아보자. 졸리운_곰 2021.02.03 710
145 [java] [jackson] Map - JSON간 변환 졸리운_곰 2021.02.02 336
144 [java] [자료구조] Remove null values from json using jackson 졸리운_곰 2021.02.02 271
143 자바 인코딩 관련 문제 종합 정리 file 졸리운_곰 2021.01.29 253
» [Java 디자인패턴] [JAVA 디자인 패턴] static을 응용한 싱글톤 패턴(Singleton Pattern) 구현 졸리운_곰 2021.01.22 158
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED