본문 바로가기
Programming Language/Java

[자바] static을 활용한 싱글톤 패턴

by ggyongi 2021. 10. 23.
반응형

싱글톤 패턴

인스턴스를 단 하나만 생성하는 디자인 패턴

 

상황 예시

회사의 직원들을 객체 지향 프로그램으로 구현하는 상황

- 이때 직원들의 인스턴스는 당연히 여러 개일 수 있지만,

- 회사의 인스턴스는 단 하나로 존재해야 함

 

 

구현 방법

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

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글