스터디

static과 싱글톤의 차이

zendyne 2024. 11. 8. 18:26

신기하게도 경력자 면접에서도 이 질문을 받은 적이 있다. static과 싱글톤의 차이가 무엇인지 대답해주세요. 하는거였다. 블로그에 한번 정리를 해보려고한다.



1. 싱글톤 패턴

많은 디자인패턴 중에서 singleton 패턴은 객체의 생성과 관련된 패턴으로서 특정 클래스의 객체가 오직 한 개만 존재하도록 보장한다. 즉 클래스의 객체를 하나로 제한한다. 생성자를 통해 여러군데에서 여러번 생성을 하더라도 최초 호출시에 만들어 놓았던 인스턴스를 재활용 한다.

사용목적
그렇다면 왜 이런 싱글턴 패턴을 사용해야할까?
1. 메모리 누수 방지

2. 공유성. 싱글톤의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다. 공통된 객체를 여러 개 생성해야 하는 상황에 많이 사용한다.

단점
1. 의존성
싱글톤 패턴을 사용하는 경우 클래스의 객체를 미리 생성한 뒤에 필요한 경우 정적 메서드를 이용하기 때문에 클래스 사이에 의존성이 높아지게 된다는 문제점이 있다. (= 높은 결합)

싱글톤의 인스턴스가 변경 되면 해당 인스턴스를 참조하는 모든 클래스들을 수정해야 하는 문제가 발생한다.

2. private 생성자 때문에 상속이 어렵다.
싱글톤 패턴은 기본 생성자를 private로 만들었기 때문에 상속을 통한 자식 클래스를 만들 수 없다는 문제점이 있다. 즉, 자바의 객체지향 언어의 장점 중 하나인 다형성을 적용하지 못한다는 문제로 이어진다.

3. 테스트하기가 힘들다.
싱글톤 패턴의 인스턴스는 자원을 공유하고 있다는 특징이 있다. 이는 서로 독립적이어야 하는 단위 테스트를 하는데 문제가 된다.

독립적인 테스트가 진행이 되려면 전역에서 상태를 공유하고 있는 인스턴스의 상태를 매번 초기화해야 한다. 초기화해주지 않으면 전역에서 상태를 공유 중이기 때문에 테스트가 정상적으로 수행되지 못할 가능성이 존재한다.

이러한 문제점들 때문에 싱글톤 패턴은 안티패턴이라고 불리기도 한다.

그래서 싱글톤 패턴을 직접 구현하기 보다는 스프링의 도움을 받아 위와 같은 문제점을 보완하면서도 싱글톤 패턴의 장점을 누릴 수 있도록 이용하고 있다.


2. 정적 클래스

1. 정의
모든 메소드가 static인 클래스

2. 사용 목적
상태를 가지고 있지 않고 global access 를 제공할 때 유용하다. Static은 컴파일 할 때 static binding 으로 싱글톤보다 좀 더 빠르며 클래스 자체에 static 을 붙여 사용할 수 없다. (inner class일 때만 가능)

3. 둘의 차이

초기화(생성) 시점
정적 클래스는 프로그램 실행 시점에 자동으로 초기화 된다. 
그렇기 때문에 프로그램의 실행 동안에 메모리에 상주한다. 
 
싱글톤 패턴을 사용한 클래스는 생성 시점을 정할 수 있다.
필요한 시점에 생성을 해서, 리소스를 효율적으로 사용 가능하다.
 대신 인스턴스 생성에는 비용이 든다. 반대로 필요없는 시점에 해제(삭제)도 가능 하다.
확장성
정적 클래스는 상속,인터페이스 구현이 불가능하다.
그리고 모든 변수와 함수에 static 키워드를 붙여야 하는 번거로움도 있다.
 
싱글톤 패턴을 사용한 클래스는 상속, 인터페이스 구현이 가능하다.
그렇기 때문에 조금 더 확장성을 가진다.
 
호출
정적 클래스는 클래스명.함수 로 쉽게 호출이 가능하다. 
 
싱글톤 패턴을 사용한 클래스는 Instance 변수를 통하여 호출한다.
 
생성자
 
정적 클래스는 정적 생성자만을 가질 수 있다.
매개변수를 갖지 못하며, public/private와 같은 액세스 한정자를 쓰지 못한다. 
 
싱글톤 패턴을 사용한 클래스는 일반 클래스 처럼 생성자를 사용 가능하다.