싱글톤 클래스와 정적 클래스는 공통된 속성이 있다.

대표적으로 다음과 같은 특징이 있다.

  1. 단 하나의 객체만 존재한다.
  2. 모든 객체에서 접근이 가능하다.

이러한 공통점으로 인해 싱글톤 클래스와 정적 클래스의 차이를 모르고 넘어가는 경우가 많다.

그렇기 때문에 오늘은 두 클래스의 차이점에 대해 알아보고자 한다.


인스턴스화

두 클래스의 차이점은 인스턴스화가 되느냐 안되느냐에서 명확히 드러난다.

 

정적 클래스는 new 키워드를 통해 인스턴스를 생성할 수 없으며,클래스의 모든 멤버는 정적으로 선언되어야 한다.

 

반면, 싱글톤 클래스의 경우 new 키워드를 통해 인스턴스를 생성할 수 있으며,정적이 아닌 멤버를 선언할 수 있다.

 

사실, 싱글톤 클래스를 두 개 이상으로 인스턴스화 하는 것은 그 클래스로 만드는 의미가 어긋나

실제론 단 하나의 인스턴스화만 하지만,

두 클래스의 명확한 차이점은 인스턴스화가 되는 여부에 따라 크게 차이난다는 것을 알려주기 위해 설명한 것 이다.


Lazy Initialization (게으른 초기화)

Lazy Initialization이란?

객체나 변수가 실제로 필요할 때까지 초기화를 지연시켜 성능을 최적화하는 방식이다.

 

싱글톤 클래스는 일반적으로 게으른 초기화를 바탕으로 객체가 생성된다.

즉, 객체가 필요한 시점에 초기화를 진행하고 참조할 수 있는 것이다.

 

"정적 클래스도 처음 호출 하는시점에 초기화가 되니깐,

필요한 시점에 호출해주면 Lazy Initialization(게으른 초기화)가 아닌가요?"

 

그렇게 생각할 수 있지만 답은 틀렸다.

정적 클래스는 기본적으로 처음 호출이후 모든 정적 멤버를 초기화하기 때문에 개별 객체나 변수가 처음 사용될 때 초기화하는 방식인 Lazy Initialization과의 개념과는 다르다고 볼 수 있다.


상속 (inheritance)

정적 클래스는 어떠한 클래스나 인터페이스에 상속할 수 없다.

즉, 상위 클래스로 정의하거나 정의된 인터페이스를 구현할 수 없어 캡슐화가 되지 않아 그 부분에서의 확장성이 떨어지며,

오로지 하나의 클래스 자체로만 사용된다.

 

반면 싱글톤 클래스의 경우 엄밀히 말하면 비정적 클래스이므로 캡슐화를 통한 정의가 가능하다.


마무리

두 클래스는 공통적인 부분도 있지만 그만큼의 차이점도 명확하다는 것을 알고 쓰임새에 맞게 사용해야한다.

 

일반적으로 정적 클래스의 경우 상태를 가지지 않아 유틸리티 클래스로 사용된다.

그외의 상태를 가져 사용할 경우 싱글톤 클래스로 정의하는 것이 좋다.


참고 :

https://bldev2473.github.io/programming/static-and-singleton

https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members

 

 

+ Recent posts