ITEM 13 :: EFFECTIVE C#
안녕하세요, 13번째 시간입니다. 이번 주제는 저번의 시간과 어느정도 공통되는 주제입니다
이번 챕터는 정적 클래스 멤버를 올바르게 초기화하자는 내용입니다. 저번시간에는 클래스 멤버의 멤버초기화 구문에 대해 포스팅을 했었는데요~ 이번에는 정적 클래스 멤버 여러개 혹은 복잡한 초기화가 있는 경우에 유용하게 사용할 수 있는 정적 생성자와 간단한 초기화를 할 수 있는 정적 멤버 초기화 구문에 대한 내용입니다. Static으로 선언한 것들에 대해서는 초기화 하는게 좋은데, 그 개념의 연장선이 될 것 같습니다. 자, 설명 시작합니다.
설명
-
정적 멤버 변수를 포함하는 타입(클래스)가 있다면 인스턴스(객체)를 생성하기 전에 반드시 정적 멤버 변수를 초기화 해야 한다.
-
정적 멤버 초기화 구문은 이전의 챕터 내용과 비슷하게도 정적 생성자보다 이전에 호출되고 그 이후에 정적 생성자가 호출되는 구조를 지니고 있다.
-
정적 생성자를 이용하는 사례는 책에서 설명하는 대표적인 예로 싱글톤 패턴이 있다. ( 싱글톤 패턴은 클래스에서 객체를 반환하는 식으로, 객체를 하나만 생성하는 개발 디자인 기법이다.)
-
아래는 그 예에 대한 코드이다.
//정적 멤버 초기화 구문 사용 버전
public class MySingleton
{
private static readonly MySingleton theOneAndOnly = new MySingleton(); // 정적 멤버를 간단하게 초기화 (싱글톤 패턴 객체 생성)
public static MySingleton TheOnly
{
return theOneAndOnly;
}
private MySingleton() // 싱글톤 패턴을 위해 기본 생성자를 private 처리한다.
{
}
}
//정적 생성자 버전 ( 초기화 과정이 더 복잡한 경우)
public class MySingleton2
{
private static readonly MySingleton2 theOneAndOnly;
static MySingleton2()
{
theOneAndOnly = new MySingleton2();
}
public static MySingleton2 TheOnly
{
get
{
return theOneAndOnly;
}
}
private MySingleton2()
{
}
}
- 전의 챕터와 동일하게도, 정적 생성자를 사용하면 try/catch 구문을 사용할 수 있어서, 예외처리가 가능하다!
그래서요?
정적 멤버를 초기화 할 때는 정적 멤버 초기화와 정적 생성자라는 2가지 기능이 있다는 것을 잊지 말고, 초기화의 복잡도에 따라 멤버초기화와 생성자를 적절히 이용하는 것이 좋을 것 같다.