싱글톤 패턴
인스턴스를 단 하나만 생성하는 디자인 패턴
상황 예시
회사의 직원들을 객체 지향 프로그램으로 구현하는 상황
- 이때 직원들의 인스턴스는 당연히 여러 개일 수 있지만,
- 회사의 인스턴스는 단 하나로 존재해야 함
구현 방법
1. 생성자를 private로 만들기
클래스 정의시 생성자를 정의해주지 않으면 디폴트 생성자가 자동으로 만들어지는데 디폴트 생성자는 public임.
따라서 디폴트 생성자가 생성되지 않도록 생성자를 반드시 명시해주어야 함
이때 private로 선언하여 클래스 외부에서 마음대로 Company 인스턴스를 생성할 수 없게 함
package first_project;
public class Company {
private Company() {}
}
2. 클래스 내부에 static으로 유일한 인스턴스 생성
1단계에서 마음대로 Company 인스턴스를 생성할 수 없게 했지만, 우리가 사용할 인스턴스 하나는 필요함.
이를 위해 Company 클래스 내부에서 하나의 인스턴스를 생성함. 이 인스턴스가 유일한 인스턴스가 됨
왜 static? -> 유일한 인스턴스를 생성하기 위해
왜 private? -> 은닉을 통해 외부에서 인스턴스에 접근하지 못하게 하기 위해
package first_project;
public class Company {
private static Company instance = new Company();
private Company() {}
}
3. 외부에서 참조할 수 있는 public 메소드 만들기
이 private한 인스턴스를 외부에서 사용할 수 있도록 해야 함
이를 위해 메서드 생성
왜 public? -> 외부에서도 사용해야 함
왜 static? -> 인스턴스 생성 여부없이 getInstance() 메서드를 호출할 수 있어야 함
package first_project;
public class Company {
private static Company instance = new Company();
private Company() {}
public static Company getInstance() {
if(instance == null) {
System.out.println("인스턴스 새로 생성");
instance = new Company();
}
return instance;
}
}
4. 결과 확인
외부 클래스에서는 Company 인스턴스를 생성할 수 없으므로 static으로 제공되는 getInstace() 메소드를 호출
유일한 인스턴스를 반환 값으로 받게 됨
package first_project;
public class CompanyTest {
public static void main(String[] args) {
Company com1 = Company.getInstance();
Company com2 = Company.getInstance();
System.out.println(com1 == com2);
}
}
결과: true
댓글