일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 자바
- 메서드
- 컬렉션 프레임워크
- 인터페이스
- Collection 인터페이스
- html
- 오류
- 깃
- CSS
- Git
- 싱글톤 패턴
- Class
- Map 인터페이스
- java
- 이클립스 설치
- 깃허브
- GitHub
- Collection Framework
- 클래스
- singlrton pattern
- 이클립스
- 해결
- 패키지
- Eclipse
- 버전관리
- Method
- Today
- Total
안루피취뽀일기
싱글톤 패턴(singleton pattern) 본문
싱글톤 패턴이란?
프로그램을 구현하다 보면 여러 개의 인스턴스가 필요한 경우도 있고 단 하나의 인스턴스만 필요한 경우도 있다. 객체 지향 프로그램에서 인스턴스를 단 하나만 생성하는 디자인 패턴을 싱글톤 패턴(singleton pattern)이라고 한다. 우리가 여기서 살펴볼 싱글톤 패턴은 static을 응용하여 프로그램 전반에서 사용하는 인스턴스를 하나만 구현하는 방식이다. 실무나 여러 프레임워크에서 많이 사용하는 패턴이므로 내용을 잘 익혀 두면 나중에 싱글톤 패턴을 응용하여 프로그램을 구현할 수 있을 것이다.
*프레임워크(framework)란 프로그램을 쉽게 개발하기 위해 구체적인 기능 설계와 구현을 미리 만들어 놓은 도구를 말한다.
어떤 회사의 직원들을 객체 지향 프로그램으로 구현한다고 가정하자. 직원은 여러 명이겠지만 회사는 하나이다. 이런 경우에 직원 인스턴스는 여러 개를 생성하는 것이 당연하지만, 회사 객체는 하나만 생성해야 한다. 그러면 싱글톤 패턴으로 Company 클래스를 단계적으로 만들어보자.
* 디자인 패턴이란?
객체 지향 프로그램을 어떻게 구현해야 좀 더 유연하고 재활용성이 높은 프로그램을 만들 수 있는지를 정리한 내용이 디자인 패턴이다. 간단히 말해서 프로그램 특성에 따른 설계 유형을 이론화한 내용이며, 특정 알고리즘이나 프로그래밍 언어를 위한 라이브러리가 아니라 객체 지향으로 설계하는 방법을 설명한 것이다. 따라서 디자인 패턴은 자바는 물론 C++이나 C#과 같은 다른 객체 지향 언어에도 적용하여 구현할 수 있다. 디자인 패턴 이론은 책 한권에 담을 만큼 방대하다.
싱글톤 패턴으로 회사 클래스 구현하기
1단계 : 생성자를 private으로 만들기
생성자가 하나도 없는 클래스는 컴파일러가 자동으로 디폴트 생성자 코드를 넣어준다. 그런데 컴파일러가 만들어주는 디폴트 생성자는 항상 public이다. 생성자가 public이면 외부 클래스에서 인스턴스를 여러 개 생성할 수 있다. 따라서 싱글톤 패턴에서는 생성자를 반드시 명시적으로 만들고 그 접근 제어자를 private으로 지정해야 한다. 그러면 생성자가 있으므로 컴파일러가 디폴트 생성자를 만들지 않고, 접근 제어자가 private이므로 외부 클래스에서 마음대로 Company 인스턴스를 사용할 수 없게 된다. 즉 Company 클래스 내부에서만 이 클래스의 생성을 제어할 수 있다.
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으로 선언해야 한다. 왜냐하면 getInstance() 메서드는 인스턴스 생성과 상관없이 호출할 수 있어야 하기 때문이다.
package singleton;
public class Company {
private static Company instance = new Company(); //유일하게 생성한 인스턴스
private Company() {}
public static Company getInstance() {
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) {
//클래스 이름으로 getInstance 호출하여 참조변수에 대입
Company myCompany1 = Company.getInstance();
Company myCompany2 = Company.getInstance();
//두 변수가 같은 주소인지 확인
System.out.println(myCompany1 == myCompany2);
}
}
myCompany1과 myCompany2를 비교해보면 같은 참조 값을 가지는 동일한 인스턴스임을 알 수 있다. 열 번, 백 번을 호출해도 항상 같은 주소의 인스턴스가 반환될 것이다. 또 Company 클래스는 내부에 생성된 유일한 인스턴스 외에는 더 이상 인스턴스를 생성할 수 없다. 이와 같이 static을 사용하여 유일한 객체를 생성하는 싱글톤 패턴을 구현할 수 있다.