본문 바로가기

Design Patterns/내 생각

싱글톤과 상태 값

안녕하세요?

요즘 맨날 영어 공부와 디자인 패턴 공부를 동시에 하기 위해, 영문 위키에 있는 디자인 패턴 번역 작업만 하다가 오랜만에 제 글을 쓰네요^^



오늘은 싱글톤에 대한 제 생각을 정리해보려 합니다. (오늘 코드 수정 작업을 하다가 든 생각입니다.^^)


저는 원래 싱글톤을 자주 사용하면서도 남용하지 않으려 노력하고 있었습니다.

왜냐하면 일각에서는 싱글톤을 안티패턴의 일종으로 간주하기 때문이죠. 



분명히 써보면 굉장히 편리한 디자인 패턴인데도 불구하고, 너무나 편리한 나머지 아무곳에서나 마구마구 쓸 수 있는 만능 클래스가 될 수 있다는 우려때문에, 싱글톤을 사용하는데에 있어 조심스럽더라구요.

그러다가 cocos2d-x를 접하게 되었는데, 여기에서 싱글톤을 꽤나 잘 쓰고 있는 것 같았습니다.


일단 cocos2d는 너무나 잘 알려진 오픈소스 게임 엔진인데요, 굉장히 유명하고 많이 사용되는만큼 코드에 대한 저의 신뢰성도 높아지더군요. 그리고 실제로 오픈 소스 엔진들을 분석해보면 꽤나 좋은 설계 요소들이 많습니다.



어쨌든 이번에 프로젝트를 진행하면서 몇몇 싱글톤 클래스를 만들 필요가 있었습니다.

일단 그 클래스들을 싱글톤으로 설계한 것은 꽤 잘 된 선택이라고 생각합니다.(어쩌면 더 좋은 방법이 있었을 수도 있지만...)


그런데 문제는 싱글톤 클래스에 상태 변수를 넣으면서부터 시작되었습니다. 처음 구현을 할 때에는 그 클래스에 적당한 상태 변수라고 생각했습니다. 이 변수 값은 setter를 통해 외부에서 수정될 수 있고, getter를 통해 외부에서 값을 확인할 수 있습니다.


싱글톤 클래스에 상태변수를 넣으면 왜 문제가 될까요?



싱글톤은 모든 클래스에서 접근 가능한 클래스이자 객체입니다. 다시 말하면, 모든 클래스에서 싱글톤의 상태값을 변화시킬 수 있다는 것이죠.

이러한 특징이 처음 구현을 할 때에는 굉장히 편하게 느껴집니다. (저도 실제로 그러했습니다. 그냥 원하는 클래스에서 싱글톤에 접근해서 상태변수를 마음 껏 바꾸면 되죠.ㅎ)


예를들어, A 클래스에서 싱글톤의 상태 변수를 변화시키고, B 클래스에서는 싱글톤의 상태 변수에 따라 어떤 일을 수행하고, C 클래스에서는 싱글톤의 상태 변수에 따라 싱글톤의 상태 변수를 다른 값으로 변화시키는 등의 코드를 작성할 수 있습니다.


그런데, 이렇게 싱글톤 객체의 상태를 이용한 코드를 작성하고나서 얼마 뒤에 그 코드에 기능을 추가하던지, 기능을 변경해야하는 경우가 있다면 굉장히 머리 아픈 일이 생길 수 있습니다.


위의 예에서 B클래스는 싱글톤 상태 변수의 값에 따라 하는 일이 결정되는데, 그 싱글톤의 상태 변수는 모든 클래스에서 값을 바꿀 수 있습니다.  그래서 B클래스에서 어떤 일이 수행될지를 확인하기 위해서는 싱글톤의 상태 변수를 변화시키는 모든 코드를 살펴봐야합니다. 

싱글톤은 너무나도 자유로운 클래스이기에 어디에서 값이 어떻게 바뀌었는지 정확히 추측해내기가 쉽지 않습니다. (물론, 정말 작은 시스템이라면 문제 없을 수도 있지만, 보통의 프로젝트는 결코 작은 시스템으로 끝나지 않죠?ㅎㅎㅎ)



그래서 오늘 내린 결론은, 싱글톤을 사용할 때에는 외부에서 접근 가능한 상태 변수를 왠만해서는 사용 안하는게 미래를 위해 좋다는 것입니다.


'Design Patterns > 내 생각' 카테고리의 다른 글

Decorator 패턴에 대한 생각 정리  (1) 2012.10.29