작년부터 안드로이드를 주 개발로 삼으면서 주변 지인들에게 코드리뷰를 받았을때 “왜 싱글톤 안썼어?” 라는 말을 많이 들었더랩죠. 그때 처음 싱글톤 이라는 단어를 접하게 됐는데 오늘 싱글톤에 관련된 글을 작성하게 됐습니다. 이 글에서는 자바(JAVA)를 예로 들어 설명하겠습니다.
싱글톤 패턴의 설명에 앞서 우리는 디자인 패턴(Design Pattern)에 대해 알고 가야합니다.
디자인 패턴(Design Pattern)이란?
디자인 패턴은 소프트웨어에서 흔히 발생하는 여러 문제의 해결책으로 “GoF(Gang of Four)의 디자인 패턴”을 집필한 4명의 저자가 처음 제시한 개념입니다. 디자인 패턴들은 프로그래밍 선배님들이 여러 고난을 겪고 이런 방법이 있으니 편하게 만들렴 하고 생각하시면 될 거같습니다. 현재도 많은 디자인 패턴들이 연구 되고 있고, 많은 개발자들이 현재도 사용하고 있습니다.
그 중 싱글톤 패턴은 디자인 패턴에 속하며 많이 사용되고 있는 패턴입니다.
디자인 패턴이 궁금하시다면 아래글을 참고해주세요!
싱글톤 패턴(Singleton Pattern)이란?
싱글톤 패턴은 “해당 클래스에 한 개의 인스턴스만을 갖게하고 전역 범위에서 이 인스턴스에 접근할 수 있도록 사용하는 패턴입니다. 예를 들어 자바 프로그램내에서 DB에 접근하려면 DBCP(DataBase Connection Pool)를 생성해서 접근해야합니다.
하지만 10개, 100개의 클래스에서 DB에 접근해야하는데 그때마다 DBCP 객체를 게속 만든다면 그건 메모리를 낭비하는격이 되겠죠. 쓰는건 똑같은 객체인데 말이죠. 그래서 DBCP 한 개의 객체를 100개의 클래스가 공유해서 쓰는 방법을 싱글톤 패턴으로 구현합니다. 다만 장점도 있듯이 단점도 존재합니다. 이유는 아래에서 설명하겠습니다.
“???:그럼 전역변수로 선언해서 사용하면 되지 않나요?”
싱글톤 패턴과 마찬가지로 전역변수를 만들어서 사용하면 언제든지 인스턴스에 접근할 수 있습니다. 하지만 해당 전역변수를 소프트웨어가 실행되는 동안 전역변수를 사용하지 않게 되면 메모리 자원은 낭비될 수 밖에 없습니다.
싱글톤 패턴의 장단점
장점은 한번의 객체 생성으로 여러 클래스가 공유할 수 있기 때문에 메모리 낭비를 방지할 수 있으며, 다른 객체와 공유할 수 있다는 장점이 있습니다. 또한 두번째 호출부터는 객체 로딩 시간이 줄어들어 성능이 향상됩니다.
단점은 많은 개발자들이 말하기를 “싱글톤을 남용하면 쓸데없이 자원을 차지하고, GC(Garbage Collector)이 자원을 회수하지 못해 메모리 자원이 줄어든다.”라고 이야기 하고 있습니다.
또한 싱글톤 클래스에 과도한 데이터를 집어넣고 여러 클래스들이 공유하게 될 경우 결합도(Coupling)는 높아지게되고, 객체지향의 원칙인 “개방-폐쇄의 원칙”을 위배하게 됩니다. 결합도가 높아진 싱글톤은 단위 테스트에도 굉장히 좋지 않습니다.
그럼 언제 사용하는게 좋은가요?
여러 객체를 관리하는 역할의 객체를 하나의 인스턴스로 생성 후 사용하는 것이 좋습니다. 예를 들어 Connection Pool, Logging, Thread Pool 등을 여러 곳에서 열람해야 하는 경우 사용하면 좋습니다.
싱글톤 패턴의 이론 부분은 여기서 마무리하겠습니다.
2편에서는 자바를 이용해 여러 예제를 작성하겠습니다.
감사합니다!
(제 깃 허븐데.. 팔로우 하실분..(쭈글))