Java & Kotlin

[Java 객체지향] Singleton Pattern (static 응용)

Sue 2022. 1. 27. 19:12

Singleton Pattern

  • 디자인 패턴 : 소프트웨어 설계할 때 공통적으로 발생하는 문제에 대한 재사용할 수 있는 해결책이다.
  • 디자인 패턴을 사용해서 설계하면 프로그램의 수정이 용이하고, 유지 보수가 쉬우며 확장성이 크다.
  • 하나의 클래스에서 여러 개의 인스턴스가 생성되는 경우가 대다수지만 인스턴스가 여러 개일 때 문제가 생기는 경우가 있을 수 있다. (e.g. 날짜, 회사 ..)
  • Singleton Pattern : 디자인 패턴의 일종으로 프로그램에서 인스턴스가 단 한개만 생성되어야 하는 경우에 사용한다.

예제 코드

Company.java

1) 클래스 내부에서 private으로 유일한 인스턴스를 생성한다. static으로 변수를 설정하는 것은 static method에서 사용하기 위함, private으로 설정하는 것은 외부에서 인스턴스를 변경할 수 없게 하기 위함.

 

2) private으로 default 생성자를 만들어 외부에서 생성자를 사용할 수 없도록 한다.

 

3) 외부에서 인스턴스를 접근하기 위한 유일한 메서드 getInstance()를 생성한다. (이름은 getInstance가 주로 쓰임)

package ch18;

public class Company {
	
	// Singleton Pattern
	
	private static Company instance = new Company();	// 1) 유일한 인스턴스는 클래스 내부에서 생성
	
	private Company() {	// 2) private - 외부에서 Company 인스턴스를 생성할 수 없음
		
	}
	
	public static Company getInstance() {	// 3) 외부에서 인스턴스를 접근하기 위한 메서드. 
		if(instance == null) {	// 인스턴스가 null일 경우 생성해주는 방어적인 코드
			instance = new Company();
		}
		return instance;
	}
}

 

CompanyTest.java
  • 클래스 이름으로 인스턴스를 참조한다.
package ch18;

public class CompanyTest {

	public static void main(String[] args) {
		
		Company company1 = Company.getInstance();	// 인스턴스를 생성하지 않고 메서드 호출
		Company company2 = Company.getInstance();
		
		System.out.println(company1);
		System.out.println(company2);
		
	}

}

 

수행 결과
ch18.Company@2f92e0f4
ch18.Company@2f92e0f4

 

  • 클래스 외부에서 생성자를 이용해 인스턴스를 만들 수 없다.
  • Company 클래스의 유일한 인스턴스는 클래스 내부에 존재하여 getInstance 메서드로만 접근할 수 있다.
  • Company 참조 변수를 여러개 만들어도 가리키는 인스턴스는 같으므로 주소값을 출력했을 때 같은 값을 가지는 것을 볼 수 있다.

 

 

넘 헷갈리는 static.. 그래도 헷갈리는 키워드를 지워보면서 에러가 발생한 부분을 찾아보면 이해가 된다!