본문 바로가기
Java

[Effective Java] Item3 private 생성자나 열거 타입으로 싱글턴임을 보증하라

by 신입같은 3년차 2020. 12. 10.

Item3까지 오게 되었습니다. 바로 시작해보겠습니다.

Effective Java에서의 Item3에서는 private 생성자나 열거타입으로 싱글턴임을 보증하라는 내용입니다.

일단 싱글턴에 대해 알아보겠습니다 .

싱글턴(singleton) 이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말합니다.
자바, 스프링을 개발해보셨다면 누구나 들어보셨을만한 내용입니다.

싱글턴객체의 예로는 Item24에 나오는 함수와 같은 무상태 객체나 설계상에 유일해야하는 시스템 컴포넌트를 예로 들 수 있다.

주의해야하는상황은 클래스를 싱글턴으로 만들게 된다면 사용하는 클라이언트를 테스트하기가 어려워진다.

싱글턴을 만드는 방식은 보통 두가지 방법이 있는다 두방식 모두 생성자는 private로 감춰두고 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 만든다.

첫번재 방법 , public static final 필드 방식의 싱글턴

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

두번재 방법, Item1 정적 팩터리 방식의 싱글턴

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

이렇게 2가지 방식이 있습니다.

이 두가지 방법은 시스템에서 하나뿐임을 보장하게 해줍니다.
( Item65에 나오는 방식으로 생성자가 호출이 가능하지만 추후에 알아보도록 하겠습니다. )

public 필드 방식의 장점은 해당 클래스가 싱글턴임이 API에 명백히 들어난다는 점입니다.
이유는 간단합니다 public static필드가 final 이다? 맨처음 메모리에 올라오고 나서 변경이 불가능하니 명백히 들너난다고 볼 수 있습니다.

그다음은 바로 간결함입니다.

두번째 방법인 정적 팩터리 방식의 싱글턴의 장점은 API를 변경하지 않아도싱글턴이 아니게 변경할 수 있다는 점이다. 2번째 장점은 원하면 정적 팩터리를 제네릭 싱글턴 팩터리로 만들 수 있다는 점입니다. (자세한 이야기는 Item30 을 공부하면서 보겠습니다 )

싱글턴을 만드는 방식은 2가지라고 했으나 Enum타입을 통해서도 만들 수 있습니다.
바로 원소가 하나인 Enum 타입을 선언하는 것입니다 .

enum Elvis{
    INSTANCE
}

public 필드 방식과 비슷하지만 더 간결하고 리플렉션이나 제 2의 인스턴스가 만들어지는 일을 막아준다.
대부분 상황에서는 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법입니다.

하지만 싱글턴이 Enum 외의 클래스를 상속받아서 사용해야 한다면 이 방식은 사용할 수 없습니다. ( Enum 타입이 다른 interface를 구현하도록은 가능하다.)

반응형

댓글