[Java] 싱글턴(singleton)
1️⃣ 싱글턴(singleton)
- 싱글턴이란 클래스의 인스턴스를 오직 하나만 생성되도록 보장하고, 어디에서든 이 인스턴스에 접근할 수 있도록 하는
디자인 패턴 입니다. - 이러한 기능과 비슷하게 동작하는 것을 어디서 본적이 있습니다. 바로
static
키워드로 메서드를 구성하여 어디에서든 메소드에 접근이 가능하도록 하는 것입니다. 단, 생성자를private
으로 만들어 인스턴스를 생성하지 못하도록합니다. 하지만 이런식의 static키워드의 사용은 OOP정신과 거리가 멀다며(객체인스턴스를 생성하지않고 메소드에 접근하기 때문, 다른이유도 존재..) 비판을 많이 받았습니다. 이를 보완하여 좀 더 OOP정신에 가깝게 만든 것이싱글턴 이라는 말도 있습니다.
2️⃣ 디자인 패턴
- 싱글턴패턴은 GoF(Gang of Four)의 디자인패턴중 하나입니다.
- 모든 오류를 대비하여 코드를 설계하고 구현을 하는 것은 힘듭니다.
디자인 패턴 은 경험많은 프로그래머가 수많은 경험을 통해 합리적으로 만든 알고리즘으로 예상치못한 오류가 생기는 것을 방지해주어 개발자의 실수를 줄여주는 역할을 합니다. - 하지만 이러한 디자인 패턴의 특성은 양날의 검이라고 생각합니다. 프로그래밍 언어를 공부하는 입장에서 실수나 오류를 줄이기 위해서는
스스로 코딩을 많이 해보고 실수가 왜 일어나는지 경험해보고 해결하는 과정 이 반드시 필요하기 때문입니다. 그렇기 때문에 충분한 실력을 갖추지 않고 무분별하게 디자인패턴을 인용하여 사용하게 된다면 오히려 코드가 비효율적으로 구성될 가능성이 큽니다.
3️⃣ 싱글턴 패턴 기본 구현
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 생성자를
private
접근제어자로 만들어주어 외부에서 생성하지 못하도록 만듭니다. getInstance()
메소드를 이용하여 인스턴스를 받을 수 있으며if
문을 통해 인스턴스없을 경우 인스턴스를 새로 생성하여 반환해줍니다.
4️⃣ 고찰
- 싱글턴 패턴을 이용하면 여러개의 인스턴스를 생성해주는 것을 막아줍니다. 하지만
멀티스레드 로 싱글톤패턴을 사용하면 문제점이 발생하는 경우가 있다고 합니다.
< 멀티스레드+싱글턴 관련 참고하면 좋을 사이트 >
1. 멀티스레드 환경에서의 싱글톤 패턴 - Jungwoon Blog
2. Singleton 패턴의 모든 것 (멀티스레드 고려) - 자바공작소
- 디자인 패턴은 합리적인 코드 설계법을 제시해주는 것뿐이지 정답은 아닙니다. 또한 여러가지 변형된 형태의 싱글턴 패턴(생성, 삭제기능이 포함된 싱글턴 등등..)들도 존재합니다.
- 이러한 간단한 디자인패턴인데도 여러가지 예외상황이 존재합니다. 위에서도 말했듯이 디자인 패턴의 무조건적 인용은 피해야합니다. 싱글턴 패턴은 디자인패턴중에서도 실제로 업계에서 많이 사용하는 디자인패턴중 하나라고 합니다. 개인적으로 아직 싱글턴 패턴에 대해 이론적으로 밖에 배우지 않았기때문에 좀 더 실무에서 경험을 해보고 사용할 계획입니다.(아마 오랜시간 뒤에 다시 싱글턴패턴에 대해 다시 정리하는날이 올지도..)