싱글톤(Singleton)은 단 하나의 인스턴스를 같는 것을 의미한다.

여러차례 호출되더라도 메모리에 단 하나의 인스턴스만 올라가 있기 때문에 메모리 낭비가 없으며

데이터 공유가 용이해지는 것이 장점이다.

 

 

싱글톤을 만드는 방식은 두가지가 있는데 private으로 무엇을 막아두고 public으로 무엇을 여냐에 따라 달라진다.

 

 

Case 1) 생성자를 막아둔 경우

public class Singlton{
    public static final Singleton instance = new Singleton();

    private Singleton(){

    }
}

Case 2) 정적 팩토리를 사용한 경우

public class Singlton{
    private static final Singleton instance = new Singleton();

    public static Singleton(){

    }
}

Case 1의 경우 생성자를 막아두었기 때문에 Singleton.instance로 접근해야 하고

Case 2의 경우 생성자의 경우 getInstance를 할 수 있는 메소드를 만들어서 접근해야 한다.

 

장점

Case 1 : 해당 클래스가 싱글톤임이 API에 명백히 드러남

Case 2 : 정적 팩토리를 제네릭 싱글톤 팩토리로 만들 수 있다는 점 (추후 제네릭관련 주제로 포스팅)

 

Case 3 : 열거 타입 사용

public enum Singlton{
    INSTANCE:
}

 

열거 타입 자체가 상수로 저장하기 때문에 이런식으로도 사용 할 수 있다.

 

 

 

 

이렇게 싱글톤 패턴 생성 방법 3가지를 알아 보았는데 사실, 이 장에서 중요한 것은 "직렬화"의 개념이다.

저자는 Case1, 2의 경우 리플렉션이나 역직렬화시 다른 객체가 생성될 수 있다는 단점이 있다고 말하였는데

 

정확히 직렬화의 개념부터 잡고 가겠다.

 

 

직렬화는 객체를 바이트 형태로 전환하는 것을 의미하며

역직렬화는 바이트 형태의 데이터를 다시 객체로 전환하는 것을 의미합니다.

 

직렬화는 자바 내부를 위한 기능이 아닌 자바 시스템간의 데이터 공유를 위해 사용 됩니다.

 

그런데,싱글톤이지만 역직렬화시에 기존의 객체가 아닌 다른 객체가 생성되는 문제점이 발생합니다.

 

이것을 막기 위해 Serializable 인터페이스의 숨은 메소드는 readResolve를 사용하여 instance를 리턴하게 하면

싱글톤이 유지됩니다.

+ Recent posts