싱글톤 패턴

윤주헌's avatar
Aug 12, 2024
싱글톤 패턴
 

싱글톤이란?

💡
객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다.
인스턴스 → 객체를 실체화 한것( 메모리에 할당되는 것)
 

그림 설명

notion image
두번째 new하는 것을 막는 것 (싱글톤 패턴)
notion image
나중에 시간이 지나고 떠야할 것들 스태틱으로 바로 띄우면 안되는 것들을 싱글톤으로 띄운다

예시

 
 
public class App { public static void main(String[] args) { //두번째 new하는 것을 막아야 한다 Doorman d1 = new Doorman(); Doorman d2 = new Doorman(); } }
 
  1. 일단 생성자의 접근 제한자를 public → private로 바꿔서 new로 여러개의 객체가 만들어지는 것을 막는다
public class Doorman { private Doorman doorman = new Doorman(); private Doorman(){} //책임줄거다 쥐 출입금지 public void 쫓아내(Animal m){ System.out.println(m.getName()+"쫓아내"); } }
  1. 단 한번만 사용하기 위해서는 스태틱으로 해야한다
    1. new되지 전까지는 코드는 아무 것도 실행 안됨
private static Doorman doorman = new Doorman();
스태틱을 private Doorman에 넣어줌(변수임 함수(호출 시 열리는 것)가 아님)
heap에 떠있다 doorman이 Doorman의 static이 doorman을 관리한다 우변에서 new Doorman()적용heap 좌변은 스태틱에 들어가 있다.
 
heap에는 “쫓아내” 메서드만 들어감(new Doorman으로 인해서) static에서는 doorman이 떴다
 
메인 시작전에 도어맨 객체가 띄워져 있다 생각한다 화면에만 안보일 뿐이지 → 이거를 외부에서 땡겨야함 private이니까

스태틱, heap 공간 그림 설명

notion image
 
 
다음
메서드를 만든다
public Doorman getInstance(){ return doorman; }
 
→ 왜 스태틱을 붙인다고 했지? (외부에서 끌어다 쓰려고)
 
public static Doorman getInstance(){ return doorman; }
아직 매인 실행도 안됨
 

실행 순서 한번 더

  1. static찾는다 private static Doorman doorman = new Doorman(); 실행
  1. Doorman안에 static공간(클래스 마다 있다)이 있는데 doorman 변수 이름만 뜬다. 스태틱때문에 new Doorman이 사용됨 heap에 뜬다(이 heap은 클래스 내부가 아니다)
  1. heap에 Doorman공간이 생긴다(스태틱이 안 붙은것이 들어간다(여기서는 쫓아내))(실행X 그냥 뜬거임)
  1. 그 다음
public static Doorman getInstance(){ return doorman;}
public class App { public static void main(String[] args) { //두번째 new하는 것을 막아야 한다 Doorman d1 = Doorman.getInstance(); Doorman d2 = Doorman.getInstance(); System.out.println(d1.hashCode()); System.out.println(d2.hashCode()); } }
getInstance가 스태틱공간에 뜬다.
public static Doorman doorman = new Doorman();
하고
public static Doorman getInstance(){ return instance;}
지우면
public class App { public static void main(String[] args) { Doorman d1 = Doorman.instance; Doorman d2 = Doorman.instance; System.out.println(d1.hashCode()); System.out.println(d2.hashCode()); } }
결과 → d1, d2 해도 같은 주소로 하나만 만들어 진다
notion image
 

궁금증

  • public static Doorman instance = new Doorman();하나
  • private static Doorman instance = new Doorman();
    • public static Doorman getInstance(){ return instance; } 해서 하나 같은데 뭐가 다른가? 코드 하나만 사용하는게 더 좋지 않나?
      → 그냥 방법 중 하나다
 

해시 코드 설명

해시 코드 → 실제 주소를 메모리화 시킨것 (실제 주소는 아니다)
4gbite(40억) 메모리 주소 공간(1바이트)이 40억개 있다는 거임
복잡한 공간을 os가 알아서 찾아준다( 만약 6899번지라 한다면 이 번지를 보여주는게 아니고 헤시라는 알고리즘 돌려서 (난수 보여줌) 이게 대신 보여줄 것을 보여줌)
 
notion image
 

해시란? 자세하게

💡
 
Share article

code-sudal