티스토리 뷰

 

[Effective C# Item 13] 정적 클래스 멤버를 올바르게 초기화하라

정적 멤버를 포함하는 타입이 있다면 인스턴스를 생성하기 전에 반드시 정적 멤버 변수를 초기화해줘야 한다. 정적 멤버를 초기화하기 위해 C#은 정적 생성자와 정적 멤버 초기화 구문을 제공한다.


1. 정적 생성자

정적 생성자는 타입 내에 정의된 모든 메서드, 변수, 속성에 최초로 접근하기 전에 호출되는 특이한 메서드다. 이 메서드를 활용하여 정적 변수를 초기화하거나, 싱글턴 패턴을 적용해보거나, 생성자 호출 전이든 다양한 작업을 하기 편하다.

public class MySingleton1
{
private static readonly MySingleton1 theOneAndOnly;
static MySingleton1()
{
theOneAndOnly = new MySingleton1();
}
public static MySingleton1 TheOnly
{
get
{
return theOneAndOnly
}
}
private MySingleton1() { } // 이하
}

가끔 멤버 초기화 구문 대신 반드시 정적 생성자를 사용해야 하는 경우도 있는데 이전 멤버 초기화 구문을 사용하라 편에서도 나왔던 예외 처리를 해야할 경우다. 멤버 초기화 구문은 try-catch 구문을 사용할 수 없기 때문에 예외를 잡을 수 없고 따라서 아래와 같이 정적 생성자를 통해서 정적 멤버 변수의 초기화 시 예외 처리가 가능해진다.

static MySingleton1()
{
try
{
theOneAndOnly = new MySingleton1();
}
catch
{
// 복구를 시도한다.
}
}

2. 정적 초기화 구문

인스턴스 멤버 초기화 구문과 마찬가지로 간단하게 정적 멤버를 초기화하는 경우라면 정적 생성자 보다는 정적 초기화 구문을 사용하는 것이 간편하다.

public class MySingleton1
{
private static readonly MySingleton1 theOneAndOnly = new MySingleton1();
public static MySingleton1 TheOnly
{
get
{
return theOneAndOnly
}
}
private MySingleton1() { } // 이하 생략
}

정리

오늘은 좀 간단하다. 정리하자면 정적 클래스 멤버를 초기화할 때 정적 생성자와 정적 초기화 구문을 사용할 수 있다.

간단하게 사용할 거면 정적 초기화 구문을 사용하고 예외 처리가 필요하거나 다양한 동작을 구현할 때 정적 생성자를 사용하자!


정적 생성자라는 개념을 오늘 처음 알아서 재밌었다.

그리고 안 그래도 어제 정적 멤버 초기화하는 데서 좀 머리 아팠던 기억이 났다.

오늘 가서 다시 고쳐봐야겠다.

참조 - Effective C# <강력한 C# 코드를 구현하는 50가지 전략과 기법, 이펙티브>, 빌 와그너, 김명신, 한빛미디어

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함