[디자인 패턴] 싱글톤패턴

HyeBin, Park·2022년 4월 5일
0

디자인 패턴

목록 보기
1/1
post-thumbnail

🔍 Singleton pattern

  • 최초 한번만 인스턴스를 생성하고 제공합니다.

1. Eager initialization (이른 초기화)

  • 미리 초기화를 시켜주고 해당 인스턴스를 return 해줌으로써 매번 같은 인스턴스를 가지게 됩니다.
  • 문제점
    • 메모리 낭비 : 사용하지 않을때도 항상 생성
    • 예외 처리 불가능

2. Static block initialization

  • 인스턴스가 static block 내에서 생성되어 예외 처리가 가능
  • 단점
    • 여전히 메모리 낭비

3. Lazy initialization

  • getInstance가 호출될때 초기화를 해서 메모리 낭비의 단점을 해결함
  • 문제점
    • 동기화 보장 x
      • 동기화 : 스레드가 수행되는 시점을 조절하여 서로가 알고 있는 정보가 일치하는 것인데, 쉽게 말해 스레드 간 데이터가 일치하도록 하는 것이다.

4. Thread safe initialization

  • synchronized 를 통해서 동시에 여러 스레드가 접근하지 못하도록 막음
  • 문제점
    • 성능 저하 : 매번 synchronized가 실행됨

5. Double-Checked Locking

  • instance null 체크를 synchronized 블록 밖과 안에서 총 2번 해줍니다. ⇒ 성능 저하가 줄어듬
  • volatile : 변수를 메인 메모리에 저장, 주로 여러 스레드가 동시에 접근할 수 있는 변수에 사용
  • volatile을 사용하지 않았을때 일어날 수 있는 문제점

6. Bill Pugh Solution

  • final 을 통해 INSTANCE 첫 호출 후 재할당이 되지 않고, 동기화 보장이 가능합니다.
  • final
    • static은 클래스 로딩시점에 한번만 호출이 됨
    • 초기화 후 변경이 불가능하다.
    • final이 초기화되는 시점은 클래스의 부모 생성자가 실행 된 이후, 생성자 메소드가 실행되기 전
    • final methods는 메소드 오버라이드 제한 , final class는 상속될 수 없음
  • 클래스 로더 내용 추가하기
  • https://velog.io/@skyepodium/클래스는-언제-로딩되고-초기화되는가

7. Enum

  • 간결하다.
  • enum은 고정된 상수들의 집합으로, 런타임이 아닌 컴파일 타임에 모든 값을 알고 있어야한다. ⇒ 생성자가 private로 제한(런타임시 값이 설정되면 안 되기때문에) ⇒ enum 클래스 내에서 인스턴스 생성이 불가능 ⇒ 싱글톤의 성질을 갖게됨
  • 직렬화/역직렬화 스스로 해결
  • reflection 공격에 안전하다. (AccessibleObject.setAccessible)
  • 단점 : 싱글턴이 다른 클래스를 상속한다면 사용 불가능 ✔
  • https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kbh3983&logNo=220907314096

💁‍♀️ 직렬화/역직렬화

  • 직렬화 : 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte) 형태로 데이터 변환하는 기술
    • 외부의 자바 시스템 : 파일, db, 캐시와 같은 메모리, 다른 vm
    • Serializable
      • 마커인터페이스 : 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해주는 것
      • ObjectOutputStream 을 통해 쓸 수 있다고, 즉 직렬화 가능한 클래스 임을 알려준다.
    • enum 이외에 다른 방식은 직렬화를 할때 문제가 생김
  • 역직렬화 : 바이트로 변환된 데이터를 다시 객체로 변환하는 기술

💁‍♀️ Reflection

  • 자바에서 기본적으로 제공하는 API

Reference

0개의 댓글