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

silver's avatar
Nov 13, 2024
[디자인패턴] 5. 싱글톤패턴
 
  • 클래스의 인스턴스를 하나만 생성하도록 보장하는 디자인 패턴으로 어떠한 클래스가 단일 객체로만 존재해야할 때 사용한다.
  • DB연결, 로깅 시스템, 캐시와 같은 프로그램 내에서 여러 곳에서 접근(전역접근이 가능해야한다)하지만 하나의 상태만 유지하는 리소스에 유용하다.
 
싱글톤 패턴의 장점
  • 전역적 접근성: 애플리케이션 어디서든 인스턴스에 접근할 수 있습니다.
  • 메모리 절약: 한 번 생성된 인스턴스를 재사용하므로 메모리 효율성이 높습니다.
  • 상태 관리의 일관성: 단일 인스턴스로 상태를 공유하기 때문에 데이터 일관성을 유지할 수 있습니다.
싱글톤 패턴의 단점
  • 단일 책임 원칙 위반 가능성: 전역 접근성이 제공되므로, 클래스가 여러 책임을 가지게 될 위험이 있습니다.
  • 테스트 어려움: 싱글톤 클래스는 인스턴스가 고정되어 있어 유닛 테스트에서 모킹(Mock)을 적용하기 어렵습니다.
  • 병목 현상: 싱글톤 인스턴스에 동기화가 적용된 경우, 여러 스레드가 동시에 접근할 때 성능 저하가 발생할 수 있습니다.
 

1. 싱글 톤패턴 이해 코드

상위 클래스

public abstract class Animal { public abstract String getName(); }
 

하위클래스

public class Cat extends Animal { private String name = "고양이"; @Override public String getName() { return name; } } public class Mouse extends Animal { private String name = "쥐"; @Override public String getName() { return name; } } public class Doorman { // static을 이용한 이른 초기화로 싱글톤 패턴 생성 static Doorman instance = new Doorman(); //static으로 new로 바꾼다 private Doorman() {} //private로 바꾸면 다른 class에서 사용 불가능하다. public void 쫓아내(Animal animal){ System.out.println(animal.getName()+" 쫓아내"); } }
 

App

public class App { public static void main(String[] args) { // Doorman doorman = new Doorman(); Doorman doorman = Doorman.instance; Doorman doorman2 = Doorman.instance; //같은 주소 확인을 위해 hashCode찍어본다 // -> 793589513로 같음! // -> doorman과 doorman2는 동일한 객체이다 -> 싱글톤 System.out.println(doorman.hashCode()); System.out.println(doorman2.hashCode()); //hashcode -> 50개의 임의의 난수, 충돌날 확률이 매우 낮음 // call by value -> 값이 바로 나와 기본자료형(사이즈를 알 수 있어 int double float) // call by reference -> 주소 튀어나와 레퍼런스 자료형(사이즈를 알 수 없다 String -> pointing해야한다) Animal cat = new Cat(); Animal mouse = new Mouse(); doorman.쫓아내(cat); doorman.쫓아내(mouse); } }
Share article

silver