싱글톤 패턴
싱글톤 패턴이란 클래스의 인스턴스화를 하나의 객체로 제한하는 패턴입니다.
싱글톤 구현에는 여러가지 방법이 있습니다.
1. Object Literal
var Discount = {
dDay : 25,
gift : 'champagne',
info() {
return `dDay : ${this.#dDay}\ngift : ${this.#gift}`;
}
}
이렇게 코드를 작성하면 불변성이 성립되지 않기 때문에 언제든지 재정의될 수 있는 위험이 있습니다.
const Discount = Object.freeze({
dDay : 25,
gift : 'champagne',
info() {
return `dDay : ${this.#dDay}\ngift : ${this.#gift}`;
}
})
export default Discount
변수를 const로 선언해주고 Object.freeze()를 사용하면 변경/추가를 할 수 없습니다. 여기서 주의할 점은 만약 객체가 이중 객체이상이라면 deepFreeze를 해주는게 좋습니다.
2. class로 구현하기
class Discount {
#dDay = 25;
#gift = "champagne";
static instanceRef = null;
static getInstance() {
if (!Discount.instanceRef) {
Discount.instanceRef = new Discount();
}
return Discount.instanceRef;
}
info() {
return `dDay : ${this.#dDay}\ngift : ${this.#gift}`;
}
getGift() {
return this.#gift;
}
setGift(gift) {
this.#gift = gift;
}
}
const discount1 = Discount.getInstance();
const discount2 = Discount.getInstance();
console.log({ discount1: discount1.getGift() });
console.log({ discount2: discount2.getGift() });
`getInstance()` 메서드는 정적 메서드이므로 클래스 인스턴스가 없을 때 메서드를 호출하며, `instanceRef`에 저장된 단일 인스턴스의 참조가 없는 경우에만 새 인스턴스를 만들고 그렇지 않은 경우에는 저장된 인스턴스 참조를 반환합니다.
싱글톤의 장점
1. 메모리
싱글톤을 사용하면 최초 한번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때나 메모리 낭비를 방지 할 수 있습니다. 뿐만 아니라 이미 생성된 인스턴스를 활용하니 속도 측명에서도 이점이 있습니다.
2. 데이터 공유
싱글톤 인스턴스가 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용할 수 있습니다. 하지만 여러 클래스의 인스턴스에서 싱글톤 인스턴ㅅ의 데이터에 동시에 접근하게 되면 동시성 문제가 발생할 수 있으니 유의해야합니다.
싱글톤의 단점
1. 책임
싱글톤의 단점은 너무 많은 책임을 가지거나 많은 데이터를 공유하게 되면, 클래스간 결합도가 너무 높아져 OCP를 위반하게 됩니다. 따라서 수정과 테스트가 어려워지게 됩니다.
2. 두 가지 일
싱글톤은 자신의 인스턴스가 있는지 확인하고 유지되도록 하기 때문에 두 가지를 담당하여 SRP를 위반합니다.
📒 Reference
'정보' 카테고리의 다른 글
[Effective java] Item 4 인스턴스화를 막을려거든 private 생성자를 사용하라 (0) | 2024.02.25 |
---|---|
[Effective java] Item 1 생성자 대신 정적 팩터리 메서드를 고려하라 (0) | 2024.02.18 |
[JEST] Mocking (0) | 2023.11.05 |
코드리뷰 잘 활용하기 (1) | 2023.10.23 |
코딩테스트할 때 유용한 코드들 (1) | 2023.10.01 |