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

이나겸's avatar
Nov 13, 2024
[디자인패턴] 싱글턴패턴
💡
특정 클래스가 단 하나만의 인스턴스를 생성하여 사용하기 위한 패턴

특징

  • 생성자가 여러번 호출돼도 실제로 생성되는 객체는 하나만 존재하도록 보장
    • 애플리케이션에서 동일한 인스턴스에 접근 가능
    • 객체를 필요할 때마다 생성하는 것이 아닌 단 한 번만 생성해서 전역에서 공유하고 사용 가능 (불필요한 자원 생성 방지, 메모리 절약)
  • 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체 리턴
 

예제

  • Doorman 클래스에 싱글턴 인스턴스 생성
  • main(App 클래스의 main)에서 싱글턴에 접근하여 호출
  • 여러 번 호출한 객체들이 같은지 해쉬코드 호출로 확인
package ch04; // 추상 클래스 => 상속 가능 public abstract class Animal { public abstract String getName(); } package ch04; // 고양이 Object // Animal 상속 public class Cat extends Animal { private String name = "고양이"; // 부모와의 동일 메소드 오버라이드 public String getName() { return name; } } package ch04; // 쥐 Object // Animal 상속 public class Mouse extends Animal { private String name = "쥐"; // 부모와의 동일 메소드 오버라이드 public String getName() { return name; } } package ch04; public class Doorman { // 싱글턴 => App 클래스에서 접근 가능 (전역에서 공유하고 사용 가능) // static을 붙이면 프로그램 실행전에 메모리에 띄워짐(로드됨) // => 기본 생성자를 private로 접근 불가능하게 막아놨기때문에 여기에 접근하라고 static Doorman instance = new Doorman(); // 기본 생성자 // private로 접근불가능하게 막음 private Doorman() {} // 이 클래스의 책임 public void 쫓아내(Animal animal) { System.out.println(animal.getName() + " 쫓아내"); } } package ch04; public class App { public static void main(String[] args) { // 싱글턴 // 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체 리턴 // => 이 경우, 호출된 Doorman 두 개가 같다는 뜻 Doorman doorman = Doorman.instance; Doorman doorman1 = Doorman.instance; // 두 객체가 같은지 확인 용 해쉬코드 출력 // 싱글턴은 여러번 호출돼도 생성되는 객체는 하나라서 둘이 같음 // hashcode : 단방향 암호화(이메일 난수), 충돌(중복)확률이 낮음 System.out.println(doorman.hashCode()); System.out.println(doorman1.hashCode()); Cat cat = new Cat(); Mouse mouse = new Mouse(); doorman.쫓아내(cat); doorman.쫓아내(mouse); } }
Share article

Nakyeom's Study