인터뷰 당시 땀을 삐질삐질 흘리게 만들었던 질문들이 있었습니다.
그중 하나였던 주제가 singleton pattern이었는데요.
기본적인 개념은 이미 숙지하고 있었지만 추가 학습하지 않았던 것이 스노우볼이 되었고
인터뷰에서 부족함을 들키며 총난타를 당했기 때문에 제대로 학습해보고 싶어졌습니다.
(싱글톤 패턴을 적용해 전역에서 사용하는 값이 있다고 말했을 때
이어진 후속 질문에 대한 내용입니다.)
어째서 싱글톤 패턴을 적용한 인스턴스는 전역에서 접근할 수 있을까?
(저는 클래스가 아닌, 함수와 변수로 패턴을 적용했습니다.)
싱글톤 인스턴스를 저장하는 변수를 싱글톤 패턴을 구현한 함수 외부에 선언해
전역 스코프에 존재하는 상태로 만든다면 해당 변수는 싱글톤 패턴을 구현한 함수가 호출되는
모든 컨텍스트에서 접근 가능하기 때문이라고 설명드렸는데
클래스 형태로 구성되었을 때의 추가 답변을 요구하셨습니다.
저는 30초 정도를 고민해 봤지만 클래스 사용 경험이 전무했고, 용어를 몰라
결국 현장에서 답을 하지 못했는데요.
집으로 돌아와 검색을 통해 알게 된 건 클래스의 생성자에서 인스턴스를 의미하는 변수를
static 한 변수로 선언하고, 클래스 내의 메서드를 통해 정적 변수를 관리한다는 것이었는데요.
함수와 변수로 구현한 것과 별 차이가 없었다는 것을 알고선 답하지 못한 것에 대한
아쉬움이 많이 들었습니다.
전역에서 사용할 수 있다는 장점 외에 또 다른 장점은 어떤 것이 있을까
처음 답할 땐 하나의 인스턴스만을 생성해 재사용하기 때문에
여러 인스턴스를 생성해 관리할 때보다 상대적으로
가비지 컬렉션의 대상이 되는 객체 수가 적으니 관리 부담이 덜해져
메모리 세이브가 이뤄지며 성능이 개선될 수 있다고 답했는데요.
역시나 추가적인 답을 요청해 주셨습니다.
지금은 바로 의존성을 언급해야겠다는 생각이 나는데 그때 당시엔 긴장해서 그런지..
전혀 생각이 나지 않아 추가 답을 하지 못했는데요.
인스턴스를 필요로 하는 모듈이나 컴포넌트 간의 의존성을 줄이며
코드의 결합도를 낮춰 유지보수성이 향상될 수 있다는 특징이 있었습니다.
싱글톤 패턴을 사용했을 때와 일반 객체를 사용했을 때의 차이
객체를 사용했을 땐 여러 개의 독립적인 인스턴스가 생성되지만
싱글톤 패턴을 적용했을 땐 하나의 인스턴스만 생성된다고 답했고
추가적인 답변을 요청하셔서 메모리와 연관 지어 설명했습니다.
인스턴스가 여러 개 존재한다면 각 인스턴스 별로 메모리를 차지하게 되고, 리소스 낭비로 이어질 수 있지만
인스턴스를 하나만 만들어 관리한다면 메모리 사용량을 감소시킬 수 있을 것이다라고요.
근데.. 이제 여기서 차이점을 더 말해줄 수 있냐고 말씀하셨고
저는 지금 당장은 떠오르지 않는다고 답했는데요.
인터뷰 이후에서야 인스턴스의 참조와 관련된 답을 해주시길 바란 것 아닐까..라는 생각이 들었습니다.
싱글톤 패턴을 통해 인스턴스에 접근하면 하나의 인스턴스만을 참조하지만
일반적인 객체를 통해 인스턴스에 접근하려면 각 객체의 참조가 필요한데요.
아래의 코드로 설명을 해보겠습니다.
function example(name) {
return {
name: name,
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
}
// 독립적인 인스턴스들을 생성했습니다. 둘은 서로 다른 name이라는 속성을 지니고 있어요!
const instance1 = example('Kang');
const instance2 = example('Lee');
instance1.greet();
instance2.greet();
// 독립적인 인스턴스를 참조하며 각자의 값을 보여주고 있습니다.
console.log(instance1.name); // Kang
console.log(instance2.name); // Lee
확실히 특정 값 하나만을 보여주기 위한 용도로서 일반 객체를 통한 인스턴스 관리는 옳지 않아 보입니다.
Reference
2024.05.23 - [Design Pattern] - 그저 작성했는데 싱글톤 패턴이었던 것에 대하여
'Design Pattern' 카테고리의 다른 글
Compound pattern을 적용해 공통 모달을 만들어보자 (0) | 2024.11.15 |
---|---|
HOC(=고차함수)를 사용해 전역 타이머를 구현해보자 (0) | 2024.08.10 |
완전한 싱글톤 패턴으로 리팩토링을 진행해보자 (0) | 2024.05.25 |
그저 작성했는데 싱글톤 패턴이었던 것에 대하여 (0) | 2024.05.23 |