싱글톤과 정적(static) 클래스 차이

Elenaljh·2023년 8월 5일
0

토막지식

목록 보기
4/5

1. 싱글톤

1. 정의

  • 클래스의 인스턴스를 하나만 생성하고, 어디서든 그 인스턴스를 참조할 수 있도록 하는 패턴
  • 생성자가 여러 번 호출해도 실제로 생성되는 객체는 하나

2. 싱글톤을 쓰는 이유

  • 고정된 메모리 영역을 가지고 하나의 인스턴스만 사용하기 때문에 메모리 낭비 방지
  • 싱글톤 클래스의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉬움
  • DBCP (Database Connection Pool)처럼 공통된 객체를 여러 개 생성해야 하는 상황에 많이 사용

2. 정적 클래스

1. 정의

  • 모든 메소드가 static인 클래스

2. 정적 클래스를 쓰는 이유

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

3. 둘의 차이

차이점싱글톤정적 클래스
원리인스턴스 생성해 재사용인스턴스 생성X, 생성자X
인터페이스 구현(중요)가능불가능
OOPOX
절차적 디자인으로 함수에 가깝다
override가능불가능
load필요시 lazy load 가능static binding in compile time- 빠르게 로딩
performance느림빠름 (static binding)
test쉬움어려움
저장 위치힙 (쓰레드간 공유 가능)스택 (쓰레드 관리 어려움)

1. 싱글톤 vs 정적 클래스

  • 일반적으로 싱글톤 선호 (OOP와 다형성 이점 + 구현시 더 편리함)
    - 테스트 가능성
    - 싱글톤 패턴은 상태를 가질 수 있고 생성과 파괴 시기를 선택할 수 있기 때문에 테스트하기 쉽다. 이에 반해 정적클래스는 테스트하기 어렵다
    - 확장성
    - 싱글톤 패턴은 상속할 수 있기 떄문에 다형성과 확장성을 구현할 수 있다.
    - 인터페이스 구현
    - 싱글톤 패턴은 정적 클래스와 달리 인터페이스 구현이 가능하기 때문에 유연한 코딩이 가능하다.
  • 정적 클래스가 선호되는 경우
    - 싱글톤이 상태를 갖지 않고 global access를 제공한다면 정적 클래스를 고려한다
    - 정적 클래스는 싱글톤보다 컴파일 속도가 빠르기 때문에 속도가 중요한 경우 정적 클래스 사용을 고려한다

참고: 싱글톤도 안티패턴이다

  • 의존성이 메소드 시그니처에 의해 노출되지 않는다.
    싱글톤 패턴은 어차피 하나의 인스턴스를 가지기 때문에 인터페이스의 구현에서 싱글턴 객체의 의존성을 숨겨버릴 수 있다. 이는 싱글톤 패턴의 수정이 있을 경우에 의존 관계인 메소드를 파악하는데 문제가 된다.
  • 단위 테스트를 만들기 어렵다.
    싱글턴 패턴은 애플리케이션의 수명 동안 상태를 유지한다. 따라서 싱글턴 객체의 테스트 실패로 인해 다른 테스트들에 영향을 주는 상황이 발생할 수 있다. 따라서 단위 테스트를 만들기 어렵다.
  • 하지만 컨트롤러에 의존성 주입을 하면 위와 같은 단점 극복 가능

1개의 댓글

comment-user-thumbnail
2023년 8월 5일

훌륭한 글 감사드립니다.

답글 달기