싱글톤 패턴/getInstance()

seeun·2021년 8월 3일
1
post-thumbnail

⏳ 싱글톤 패턴이란?

  • 객체 지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴
  • 프로그램 전반에서 사용하는 인스턴스를 하나만 구현하는 방식


⌛️싱글톤 패턴으로 회사 클래스 구현하기

직원은 여러 명이지만 회사는 하나
: 직원 인스턴스는 여러 개 생성, 회사 객체는 하나만 생성


🐾 단계1 : 생성자를 private으로 만들기

컴파일러가 만들어 주는 디폴트 생성자는 항상 public이다. 생성자가 public이면 외부 클래스에서 인스턴스를 여러 개 생성할 수 있다. 따라서 싱글톤 패턴에서는 생성자를 반드시 명시적으로 만들고 그 접근 제어자를 private로 지정해야 한다.(즉 company 클래스 내부에서만 이 클래스의 생성을 제어할 수 있음)

package singleton;

public class Company{
	private Company(){}
}

🐾 단계2 : 클래스 내부에 static으로 유일한 인스턴스 생성하기

프로그램에서 사용할 하나의 company 인스턴스를 클래스 내부에서 생성하기 private으로 선언하여 외부에서 이 인스턴스에 접근하지 못하도록 제한해야 인스턴스 오류를 방지할 수 있음

package singleton;

public class Company{
	//유일하게 생성한 인스턴스
	private static Company instance = new Company(); 
	private Company(){}
}

🐾 단계3 : 외부에서 참조할 수 있는 public 메서드 만들기

이제 private으로 선언한 유일한 인스턴스를 외부에서도 사용할 수 있도록 설정해야 한다. 이를 위해 public 메서드를 생성하고 유일하게 생성한 인스턴스를 반환해 준다. 이때 getInstance() 메서드는 인스턴스 생성과 상관없이 호출할 수 있어야 하므로 인스턴스를 반환하는 메서드는 반드시 static으로 선언해야 한다.

package singleton;

public class Company{
	...
    
	public static Company getInstance() {
    	if(instance == null) {
        	instance = new Company();
        }
        return instane;
    }	
}

🐾 단계4 : 실제로 사용하는 코드 만들기

Company.getInstance(); 와 같이 호출하면 반환 값으로 유일한 인스턴스를 받아 온다.

변수의 주소 값 비교하기

package singleton;

public class CompanyTest{
	public static void main(String[ ] args) {
	// 클래스 이름으로 getInstance() 호출하여 참조 변수에 대입
	Company myCompany1 = Company.getInstance();
     	Company myCompany2 = Company.getInstance();
    	System.out.println(myCompany1 == myCompany2); //true
    }	
}

myCompany1와 myCompany2를 비교해 보면 같은 참조 값을 가지는 동일한 인스턴스임을 알 수 있다.


그림출처 : https://refactoring.guru/
참고서적 : Do it 자바프로그래밍 입문(박은종)

profile
🤹‍♂️개발 기록 노트

0개의 댓글