ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Singleton
    CS/Java (with Effective) 2022. 2. 8. 14:07

    해당 글은 Effective Java Item3을 기반으로 합니다.

    private 생성자나 열거 타입으로 싱글턴임을 보증하라.

     

    Singleton 관련 내용은 아래 포스팅에서 진행했습니다.

     

    Bean 그리고 scope

    지난번 Bean이 무엇인지 간략하게 알아봤습니다. (IoC container, Bean 관련 개념이 아직 부족하시다면 간략히 이전 포스트 참고해 주세요.) Bean을 사용하는 이유 중 하나가 scope가 자동으로 singleton으로

    exponential-e.tistory.com

     

     SpringBoot Application 실행시 SpringBoot Application 이하 패키지의 @Component, @Service, @Controller, @Repository가 붙은 클래스는 Component scan을 통해 IoC container에 등록되어 관리됩니다.

    이때, 해당 Bean은 기본적으로 Singleton scope를 갖게됩니다.

     

    Singleton이란 객체가 인스턴스를 생성할 때마다 주솟값이 동일한 같은 인스턴스를 내놓는 즉, Application 전반에 걸쳐 해당 Bean의 instance가 하나만 존재하는 빈 입니다.

    객체를 생성할 때 이러한 Singleton 성질을 어떻게 보장할 수 있을지, 어떻게 구현하는지에 대한 내용을 알아보겠습니다.

     

    1. public static final 필드 방식 singleton

    public class Single {
        public static final Single INSTANCE = new Single();
    
        private Single() {
        	...
        }
    }

    INSTANCE 변수를 전역 public으로 선언해 어디서든 사용할 수 있게 설정했습니다. 다만, INSTANCE를 생성하는 생성자가 private이므로 INSTANCE가 생성될 때 단 1번 호출해 싱글턴을 보장해줍니다.

    그러나 클라이언트 측에서 리플렉션 API(AccessibleObject.setAccessible)를 사용해 private 생성자를 호출할 수 있으니 완전하게 보장해주진 못합니다.

     

    2. 정적 팩터리 방식 singleton

    public class Single {
        private static final Single INSTANCE = new Single();
    
        private Single() {
        	...
        }
        
        public static Single getInstance() { return INSTANCE; }
    }

    생성자와 변수를 모두 private으로 선언하고, getter로 해당 INSTANCE를 반환 받음으로써 매번 같은 인스턴스를 반환받을 수 있습니다. (물론 리플렉션 API에 의한 예외는 동일합니다.)

     

    3. 열거 타입 방식 싱글턴

    public enum Single {
        INSTANCE;	// private static final Single INSTANCE = new Single();
    }

    public 필드 방식과 비슷하지만, 더 간결하고 간단하게 직렬화도 가능합니다. 또한, 리플렉션 API에 의한 공격도 방어할 수 있습니다.

    단, 해당 싱글턴이 Enum 외의 클래스를 상속해야한다면 사용할 수 없습니다. (Enum 특성)

    참고로, enum의 생성자는 private으로 선언됩니다.

    그 이유는 고정된 상수를 정의하는 집합으로 컴파일 타임에 해당하는 값의 정의가 모두 이루어져야하기 때문이죠.

     

     

    Enum

    더보기
    • 인스턴스 생성 및 상속 방지: 상수 값의 타입 안정성 보장
    • 새로운 상수 타입을 정의함으로써 컴파일시 잘못된 데이터 타입 값 체크
    • 코드의 간소화 및 가독성 증가 

     

     

     

     

     

     

     

     

     

     

    참고 자료

    Effective Java - 조슈아 블로크

    반응형

    'CS > Java (with Effective)' 카테고리의 다른 글

    Generic과 raw-type 그리고 비검사 경고  (0) 2022.04.28
    Composition vs extends  (0) 2022.03.02
    HashCode  (0) 2022.02.27
    Builder  (0) 2022.02.06
    Static Factory Method  (0) 2022.01.13

    댓글

Designed by minchoba.