Static 응용 - Singleton pattern

Codren·2021년 5월 31일
0
post-custom-banner

Section 1. Singleton pattern

1. 싱글톤 패턴 (Singleton pattern)

프로그램에서 인스턴스가 단 한개만 생성되어야 하는 경우 사용되는 디자인 패턴

  • Java 에서는 Static 변수 및 메서드를 활용하여 구현할 수 있음




2. 싱글톤 패턴으로 클래스 구현

  • 디폴트 생성자를 private으로 선언
  • 클래스 내부에 유일한 private 인스턴스 생성 (자신의 class 인스턴스를 클래스 변수로 갖음)
  • 외부에서 해당 인스턴스를 참조할 수 있는 public 메서드 제공
public class Company {					# 싱글톤 패턴 적용 객체

    private static Company instance = new Company();	# 하나의 인스턴스(자신의 class 인스턴스)를 private, static으로 생성 (인스턴스를 생성할수 없게 static, 인스턴스로 접근이 불가능 하므로 클래스 변수 static)
    
    private Company() {}				# 외부에서 인스턴스를 생성할 수 없도록 pritvate으로 디폴트 생성자 정의 
    
    public static Company getInstance() {		# 외부에서 객체에 접근할 수 있도록 get 메서드 제공
		
	    if( instance == null) {
		    instance = new Company();
	    }
	    return instance;	
}




3. 싱글톤 패턴 클래스 접근

  • 하나의 인스턴스만 존재하기 때문에 같은 인스턴스를 출력함
Company company1 = Company.getInstance();
Company company2 = Company.getInstance();
		
System.out.println(company1);		# 결과 동일 (같은 주소)
System.out.println(company2);		# 결과 동일 (같은 주소)




4. 싱글톤 패턴으로 구현된 클래스의 클래스 다이어그램

  • 클래스명 - Singleton
  • 클래스 변수 - Singleton 클래스의 instance (고유)
  • 생성자 - Singleton
  • 메서드 - getInstance



Section 2. 실습

1. 싱글톤 패턴 실습

  • 자동차 공장이 있습니다. 자동차 공장은 유일한 객체이고, 이 공장에서 생산되는 자동차는 제작될 때 마다 고유의 번호가 부여됩니다. 아래 코드를 수행했을 때 1000, 1001이 출력되게끔 CarFactory, Car 클래스를 구현하시오.
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());     //1000 출력
		System.out.println(yourSonata.getCarNum());   //1001 출력
	}
}



2. 내가 짠 코드

  • CarFactory 인스턴스에서 carSerialNum 관리
  • createcar() 메서드 수행 시 SerialNum 을 인자로 넘겨 Car 인스턴스를 생성
# Car 클래스
class Car{
	private int carNum;
	
	public Car(int carNum) {
		this.carNum = carNum;
	}
	public int getCarNum() {
		return carNum;
	}

	public void setCarNum(int carNum) {
		this.carNum = carNum;
	}
	
	
	
}

# CarFactory 클래스
public class CarFactory {

		private static CarFactory factory = new CarFactory();
		
		private int carSerialNum = 1000;
		
		private CarFactory(){}

		public static CarFactory getInstance() {
			return factory;
		}
		
		public Car createCar(){
			Car carInstance = new Car(carSerialNum);
			carSerialNum++;
			return carInstance;
		}


}




3. 답안 코드

  • serialNum 을 Car 클래스에서 클래스 변수로 관리
  • serialNum 을 인자로 넘기지 않아도 되므로 클래스간 결합도 낮아짐
  • SerialNum 같이 각 객체가 생성될 때 부여되는 값은 해당 클래스에서 클래스 변수로 관리하는 것이 좋음
# Car 클래스 
public class Car {

	private static int serialNum = 999;
	private int carNum;
	
	public Car() {
		serialNum++;
		carNum = serialNum;
	}

	public int getCarNum() {
		return carNum;
	}

	public void setCarNum(int carNum) {
		this.carNum = carNum;
	}
}

# CarFactory 클래스
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;
	}
}
post-custom-banner

0개의 댓글