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.. 그래도 헷갈리는 키워드를 지워보면서 에러가 발생한 부분을 찾아보면 이해가 된다!