단 하나만 존재하는 인스턴스 - singleton pattern
- 학교와 학생의 클래스가 있다면 학생은 여러명일 수 있으나 학교는 하나여야 합니다. 이렇듯 한 클래스에 인스턴스가 하나만 존재하게 구현 하는 것을 singleton pattern이라고 합니다.
- sigleton patter에서는 생성자를 prviate으로 만들고 클래스 내부에 인스턴스를 생성합니다. 그리고 외부에서 해당 인스턴스를 사용할 수 있게 호출해주는 static 메서드를 제공합니다.
_예제
pu_blic class Company {
private static Company instance = new Company();
private Company(){}
public static Company getInsatance() {
if(instance == null) {
instance = new Company();
}
return instance;
}
}
- 1번 : Company 클래스를 만들고 외부에서 생성자를 사용할 수 없게 prviate Company 생성자를 만듭니다.
- 2번 : 지금까지 클래스 외부에서 인스턴스를 만들었지만 하나의 클래스만을 만들기 위해 클래스 내부에 private을 붙여주고 여러곳에서도 인스턴스 외부에서도 사용할 수 있게 static을 붙여 인스턴스를 생성합니다.
- 3번 : instance를 사용하는 곳에서 호출하기 위한 getInsatace 메서드를 작성하되 외부에서 사용할수 있게 public을 붙여주고 인스턴스를 생성하지 않아도 사용할수 있는 형태를 만들기 위해 static을 붙여줍니다. 조건문을 통해 혹시라도 하나의 인스턴스도 생성되지 않았다면 생성할 수 있게 해주고 인스턴스가 있다면 instance를 return해줍니다.
import java.util.Calendar;
public class CompanyTest {
public static void main(String[] args) {
Company company1 = Company.getInsatance();
Company company2 = Company.getInsatance();
System.out.println(company1);
System.out.println(company2);
Calendar calendar1 = new Calendar();
Calendar calendar2 = Calendar.getInstance();
}
}
- 1번: 테스트를 위해 CompanyTest 클래스를만들고 company1 인스턴스를 생성하는것이 아닌 Compnay.getInstance()를 통해 불러옵니다. 테스트를 위해company2를 통해 한번더 불러 옵니다.
- 2번 : 출력문을 통해 두 인스턴스에 주소값을 출력해 본 결과 두개의 주소가 같음을 볼 수 있고 인스턴스를 생성한 것이 아닌 한곳에 인스턴스를 불러 온 것을 알 수 있습니다.
- 3번 : 자바에서 제공하는 Calendar 클래스의 경우 clendar1처럼 java.until에 있는 Calendar 클래스를 생성하려고 하면 오류가 생기지만 calendar2처럼 불러와서 사용할 수 있습니다. 이처럼 자바 내부에서 제공하는 클래스나 또 단하나의 인스턴스만 생성하는 경우 singleton patter을 사용하는 것을 알수 있습니다.