singleton 이해하기
디자인 패턴 중에 하나인 싱글톤은 static을 사용하여 클래스를 통하여 생성할 수 있는 객체를 하나로 제한하는 방식입니다. 일반적으로는 클래스를 이용하여 여러 개의 객체를 생성하여 정보를 정리하였지만 날짜라던가 시간 등 고유한 정보들의 경우는 단 하나의 객체만을 가져야 하므로 싱글톤을 이용합니다.
class CompanyBoss{
private static CompanyBoss one = new Company(); //객체생성
private String bossName;
private CompanyBoss() { //생성자를 private으로 만들었습니다.
}
public static CompanyBoss getInstance(){ //객체를 가져갈 수 있도록 하는 메서드
if(one==null){
one = new CompanyBoss();
}
return one;
}
public void setName(String name){
this.bossName=name;
}
public String getName(){
return this.bossName;
}
}
public class Test{
public static void main(String[] args){
CompanyBoss c1 = CompanyBoss.getInstance(); //c1에 one 객체입력
CompanyBoss c2 = CompanyBoss.getInstance(); //c2에 one 객체입력
System.out.println(c1==c2)// true가 출력.
c1.setName("홍길동"); //bossName입력.
System.out.println(c2.getName()); //bossName출력.
}
}
위의 예시는 싱글톤을 설정하고 객체에 값을 입력하기도 하고 불러오기도 하는 예제입니다.
CampanyBoss 클래스에서 객체를 생성했습니다. 기본 생성자를 이용하여 만들었는데 여기서 기본 생성자는 public이 아니라 private으로 선언되어 있습니다. 따라서 CompanyBoss 클래스 내에서만 생성자를 사용할 수 있습니다. main에서 생성자를 만들기 위해서는 public을 이용해야 하기 때문에 getInstance메서드를 생성하였습니다. 반환되는 자료형은 CompanyBoss이며 반환되는 값은 private static으로 생성된 객체 one이 됩니다. 따라서 main에서 c1 혹은 c2를 만들고 거기에 객체의 주소를 입력합니다. 정확히 따지자면 main에서 객체를 만드는 것이 아닌 다른 클래스에서 미리 만든 객체의 주소만 따오는 것입니다.
싱글톤을 사용하는 이유는 객체가 하나만 존재하여야 하는 경우에 사용을 하기에 이러한 식으로 다른 곳에서 객체 생성은 제한하고 주소 값만 전달하여 사용합니다. 그렇기 때문에 같은 주소 값에 의하여 c1.setName을 하여도 c2의 bossName이 "홍길동"으로 저장이 됩니다. 이렇게 객체는 하나로 만들어야 하는 경우 싱글톤을 사용합니다.