싱글톤이 왜 필요한가?
평소에 우리가 클래스를 만드는 이유가 무엇인지 곰곰이 생각해 보자. 클래스는 설계도와
똑같이 생긴 여러 복제품을 찍는것에 그 의의가 있었고 우린 그렇게 사용해 왔다.
그런데 만약 우리가 단 하나의 객체가 필요하거나 여러 객체 중 외부 클래스에서 접근해야 하는
객체가 존재한다면 어떡해야 할까? 그럴 때 사용하는 것이 바로 싱글톤 패턴이다.
싱글톤 패턴 : Singleton pattern
기본적인 싱글톤 패턴은 아래의 코드와 같다.
이 코드와 아래의 코드에서 생성자를 private, public으로 선언한것이 다르다, 주의 바란다!
일단 우리는 딱 하나의 인스턴스만 만든다고 해보자. 버 X킹의 회사를 예로 들겠다.
우리가 버X킹을 위한 프로그램을 만들고 있는데, 버X킹 본사는 전 세계에 한 개다.
즉, 여러 개의 인스턴스가 필요가 없다는 의미이다. 위 코드에서 static으로 instance라는
참조변수를 통해 BurgerCompany 클래스를 선언하고 null로 초기화하였다.
참조변수가 static임이 아주 중요하다. 또, static 메서드도 하나 보인다. 메서드를 조금 더
자세히 살펴보도록 하자.
public으로 외부 클래스에서 접근이 가능하도록 하였고 반환값이 클래스인 BurgerCompany이다. 만약 instance가 null 이면 인스턴스화를 시행하고, instance를 반환한다. 아직까지 이 코드가 무엇을 의미하는지 감이 안 올 수도 있기 때문에 어떻게 활용하는지를 보자.
BurgerCompany 클래스에 sales와 num이라는 변수가 추가되고, ShowInfo( ) 라는 메서드가 추가되었음을 확인할 수 있다. sales는 매출을 의미하고 num은 판매한 제품의 개수를 의미한다.
Burger 클래스에서 burgerKing이라는 참조변수가 보일 것이다.
그런데 뭔가 이상하다.. 우리가 앞에서 배운 인스턴스화는 main함수 안에서 이루어지며 선언 이후 반드시 이루어져야 하는 것이었는데, 위 예시에선 인스턴스화의 흔적이 보이지 않는다.
대신 BurgerCompany 클래스에서 static으로 선언된 함수 getInstance( )를 실행하고 있음이 보인다. 그러면 다시 getInstance( ) 함수를 살펴보자.
만약 null 이면 인스턴스화, 그리고 그 참조변수를 반환..? 이제 이해가 가지 않는가??
static으로 선언된 instance라는 참조변수가 가지고 있는 객체의 주소를 그대로 주는 함수인 것이다. 그렇기 때문에 Burger 클래스에서 BurgerCompany라는 참조변수를 인스턴스화를 할 필요 없이 이미 static 영역에 존재하는 참조변수가 가리키고 있는 인스턴스를 함께 쓰는 것이다.
그러면 이를 활용해 보자. 각각의 버거를 샀을 때 단 하나의 객체에 접근하여 정보를 수정해 보자. Burger 생성자를 통해 제품의 이름과 가격 그리고 할인율에 대한 정보가 입력되는데, 이때마다 버거회사 (단 하나의 객체) 의 매출을 올려주고 판매한 제품의 개수도 증가시켜 주는 것이다. 그러면 아주 아름답게 결과가 잘 나오는 것을 알 수 있다.
public BurgerCompany() { }
|
private BurgerCompany() { }
|
마지막으로 생성자의 접근제어자를 다뤄보자. public의 경우 외부 클래스에서 새로운 인스턴스를 만들 수 있는 기회를 제공하고 private이라면 위 예제와 같은 경우 단 하나의 인스턴스만 존재할 수밖에 없을 것이다. 그 차이점은 맘스X치
회사를 만들 수 있을지 없을지의 차이밖에 없다.
게임 개발에서의 싱글톤
게임 개발에서 싱글톤은 상당히 많이 사용되는 패턴 중 하나이다.
플레이어에 대한 정보는 게임 안에서 단 하나여야 하고 여러 개가 생성되면
오류가 생길 수 있으므로 이를 싱클톤 패턴을 활용해 방지하기도 한다.
더 자세한 내용은 유튜브에 찾아보면 많이 나온다 ㅎㅎㅎ!!
'Lecture > Java' 카테고리의 다른 글
멈춰있는 것들: Static Variable, Static Method (0) | 2023.01.25 |
---|---|
이거 예약어 : this reserved word (0) | 2023.01.25 |
은밀하게.. 정보 은닉과 접근 제어자 (0) | 2023.01.25 |
생성자( Constructor ), 변수 유효 범위 (1) | 2023.01.23 |
도트 연산자 (dot operator) (2) | 2023.01.23 |