책너두 (헤드 퍼스트 디자인 패턴) 16일차 (~226p)

요약

  • 싱글턴 패턴
    • 문제를 해결하는 적절한 방법 선택하기
      • 멀티스레딩 문제 해결 방법 3가지
      • 싱글턴에 동기화 문제, 클래스 로딩 문제, 리플렉션, 직렬화 역직렬화 문제가 있음
        • enum 을 사용하면 해결 가능
    • 디자인 도구상자 안에 들어가야 할 도구들

메모

문제를 해결하는 적절한 방법 선택하기

  • 멀티스레딩 문제 해결하는 3가지 방법에 각각 장단점이 있음.
  • getInstance() 메소드를 동기화하는 방법
    • 항상 올바른 결과가 나옴
    • 초콜릿 보일러의 경우, 속도 문제가 그리 중요하지 않기에 이 방법을 써도 괜찮음
  • 인스턴스를 시작하자 만드는 방법
    • 초콜릿 인스턴스는 어짜피 항상 필요하기에 정적으로 초기화하는 것도 괜찮은 방법임.
    • 표준적인 패턴에 익숙한 개발자는 이상하게 보일 수 있지만 지금 상황에서는 메소드 동기화 방법이나 이 방법이나 그리 크게 차이나지는 않을 것으로 보임
  • DCL을 쓰는 방법
    • 속도 문제가 중요하지 않은 상황이기에 굳이 DCL을 쓸 필요까지는 없어보임.
    • 반드시 자바 5 이상 버전에서만 쓸 수 있다는 점을 고려해야 함.
  • 클래스 로더마다 서로 다른 네임스페이스를 정의하기에 클래스 로더가 2개 이상이라면 같은 클래스를 여러 번(각 클래스 로더마다 한 번씩) 로딩할 수 있음.
    • 싱글 턴을 이런 식으로 로딩하면 인스턴스가 여러 개 만들어지는 문제가 발생할 수 있음.
    • 따라서, 클래스 로더가 여러 개라면 싱글턴을 조심해서 사용해야 함.
    • 클래스 로더를 직접 지정하면 이 문제를 피할 수 있음.
  • 리플렉션, 직렬화, 역직렬화도 싱글턴에서 문제가 될 수 있음. → 이 부분도 염두에 둘 필요가 있음.
  • 동기화 문제, 클래스 로딩 문제, 리플렉션, 직렬화와 역직렬화 문제 등은 enum으로 싱글턴을 생성해서 해결할 수 있음.
public enum Singleton {
    UNIQUE_INSTANCE;
    // 기타 필요한 필드
}

public class SingletonClient {
    public static void main(String[] args) {
        Singleton singleton = Singleton.UNIQUE_INSTANCE;
        // 여기서 싱글턴 사용
    }
}
  • 우리가 앞서 SingleTon 클래스에 getInstance() 메소드로 클래스를 만들고 동기화한 일은 싱글턴이 어떻게 작동하는지 확실히 이해하려고 싱글턴의 작동 원리를 하나하나 따라가 본것임
  • 이제 enum을 배웠으니, 싱글턴이 필요할 때면 바로 enum을 쓰면됨.

디자인 도구상자 안에 들어가야 할 도구들

  • 싱글턴 패턴 : 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공함.

댓글

Designed by JB FACTORY