본문 바로가기
프로그래밍 ( Programming )/JAVA

[JAVA] static 응용 - 싱글톤 패턴

by Jayce_choi 2021. 5. 28.
반응형

JAVA 언어에서 싱글톤 패턴이라는 게 나옵니다.

프로그램을 구현할때 여러 개의 인스턴스가 필요한 경우가 있고 또는 단 하나의 인스턴스만 필요한 경우도 있습니다. 이때 객체 지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴을 싱글톤 패턴이라고 부릅니다.

우리가 살펴볼 싱글톤 패턴은 static을 응용하여 프로그램 전반에서 사용하는 인스턴스를 하나만 구현하는 방식으로 실무나 여러 프레임워크에서 많이 사용하는 패턴이므로 잘 익혀두면 좋습니다. 

예를 들어서 어떤 회사에서 직원들을 객체 지향 프로그램으로 구현할때 직원은 여러 명이겠지만 회사는 하나로 존재합니다. 이런 경우에 직원 인스턴스는 여러 개를 생성하는 것이 당연하지만 회사 객체는 단 하나만 생성해야 하기 때문에 싱글톤 패턴으로 회사를 만들 수가 있습니다. 또는 로봇을 조종할 때 중심에서 managing을 수행하는 파트는 싱글톤으로 만들고 다른 파츠들은 managing 파트에 접근이 가능하도록 만들어서 사용을 할 수도 있습니다. 

* 디자인 패턴이란 무엇인가? - 객체 지향 프로그램을 어떻게 구현해야 좀 더 유연하고 재활용성이 높은 프로그램을 만들지 정리한 내용이 디자인 패턴이라고 합니다. 즉 프로그램 특성에 따라서 설계 유형을 이론화 한 내용이며 특정 알고리즘이나 프로그래밍 언어가 아닌 객체 지향으로 설계하는 방법을 설명한 것을 보여줍니다.

 

예제 

단계 1 : 생성자를 private으로 만들기
단계 2 : 클래스 내부에 static으로 유일한 인스턴스 생성하기
단계 3 : 외부에서 참조할 수 있는 public 메서드 만들기
단계 4 : 실제로 사용하는 코드 만들기 

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

생성자가 하나도 없는 클래스는 컴파일러가 자동으로 디폴트 생성자 코드를 넣어 줍니다. 그러나 컴파일러가 만들어주는 디폴트 생성자는 항상 public 입니다. 생성자가 public이면 외부 클래스에서 인스턴스를 여러 개 생성 가능합니다. 따라서 싱글톤 패턴에서는 생성자를 반드시 명시적으로 만들고 그 접근 제어자를 private으로 지정해야 합니다. 그러면 생성자가 있기에 컴파일러가 디폴트 생성자를 만들지 않고, 접근 제어자가 private이므로 외부 클래스에서 마음대로 인스턴스 생성을 할 수 없게 됩니다. 

package singleton; 

public class Company{
	private Company() {}
}

 

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

단계 1에서 외부 인스턴스를 생성할수 없게 만들었습니다. 하지만 우리의 프로그램에서 필요한 인스턴스는 하나만 필요하므로 Company 클래스 내부에서 하나의 인스턴스를 생성하도록 합니다. 이 인스턴스가 프로그램 전체에서 사용할 유일한 인스턴스가 됩니다. 또한 private으로 선언하여 외부에서 이 인스턴스에 접근하지 못하도록 제한해야 인스턴스 오류를 방지할 수 있습니다. 

package singleton;

public class Company{
	private static Company instance = new Company();
    private Company(){}
}

 

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

이제 private으로 선언한 유일한 인스턴스를 외부에서도 사용가능하도록 설정이 필요합니다. 이를 위해 public 메서드를 만들고 유일하게 생성한 인스턴스를 반환하도록 만듭니다. 이때 인스턴스를 반환하는 메서드는 반드시 static으로 선언해야 합니다. 왜냐하면 getInstace() 메서드는 인스턴스 생성과 상관없이 호출할 수 있어야 하기 때문입니다. 

package singleton;

public class Company{
	...
    public static Company getInstance() { // 인스턴스를 외부에서 참조 가능하도록 public get() 구현
    	if(instance == null) { 
        	instance = new Company();
        }
        return instance; // 유일하게 생성한 인스턴스 반환
    }


}

 

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

외부 클래스에서는 Company를 생성할 수 없으므로 static으로 제공되는 getInstance() 메서드를 호출합니다.  Company.getInstance()와 같이 호출하면 반환 값으로 유일한 인스턴스를 받아 옵니다. 해당 코드를 이용하여 주소가 동일한지 확인해볼 수 있습니다. 

package singleton;

public class CompanyTest{
	public static void main(String[] args){
    	Company myCompany1 = Company.getInstance();
        Company myCompany2 = Company.getInstance();
        System.out.println(myCompany1 == myCompany2);
    }
}

 

연습문제 : 싱글톤 패턴으로 클래스 구현 해보기 

package singleton;

public class CarFactoryTest {

	public static void main(String[] args) {
		CarFactory factory = CarFactory.getInstance();
		Car mySonata = factory.createCar();
		Car yourSonata = factory.createCar();
		System.out.println(mySonata.getCarNum());
		System.out.println(yourSonata.getCarNum());
	}

}
package singleton;

public class CarFactory {
	private static CarFactory instance = new CarFactory();
	private CarFactory() {}
	
	public static CarFactory getInstance() {
		if(instance == null) {
			instance = new CarFactory();
		}
		return instance;
	}
	
	public Car createCar()
	{
		Car car = new Car();
		return car;
	}
}
package singleton;

public class Car {
	private static int serialNum = 1000;
	int CarNum;
	
	public Car()
	{
		serialNum++;
		CarNum = serialNum;
	}

	public int getCarNum() {
		return CarNum;
	}
}

Reference : INTRODUCTION OF JAVA PROGRAMMING ( DO IT )  

반응형

'프로그래밍 ( Programming ) > JAVA' 카테고리의 다른 글

[JAVA] 상속에서 클래스 생성과 형 변환  (0) 2021.06.26
[JAVA] 상속이란?  (0) 2021.06.26
[JAVA] ArrayList 란  (0) 2021.06.10
[JAVA] 배열  (0) 2021.06.01

댓글