일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ar
- 인터페이스
- Quaternion
- ExtensionMethod
- ARProgect
- 소규모프로젝트
- AR세팅
- 확장메서드
- callbyreference
- 깃허브
- 레이캐스트
- 로케트
- 게임개발
- 리듬게임에디터
- 짐벌락
- 게임제작
- 유니티
- 병맛게임
- 델리게이트
- C#
- Unity
- raycast
- callbyvalue
- AR Foundation
- 리듬게임
- 1인개발
- github
- Euler
- AR게임
- 게임
- Today
- Total
Ssssong += Dev
[C#] [Effective C#] 할당 구문보다 멤버 초기화 구문이 좋다. 본문
생성자 내에서 멤버 변수들을 초기화할 코드를 누락하는 경우가 있으므로
이러한 오류를 범하지 않으려면 생성자의 본문에서 멤버 변수 값을 할당하기보다 멤버 초기화 구문을 사용하는 것이 좋다.
public class MyClass
{
//이렇게 선언과 동시에 초기화하는 것이 멤버 초기화 구문이다.
private List<string> labels = new List<string>();
}
C# 컴파일러는 생성자를 갖지 않는 타입을 선언한 경우에도 기본 생성자를 자동 생성하는데,
멤버 초기화 구문을 이용하면 컴파일러가 생성해 주는 기본 생성자의 앞쪽에도 초기화 구문이 포함된다.
멤버 초기화 구문에 의해 생성된 코드는 생성자 본문의 앞쪽에 덧붙여진다.
이는 생성하려는 타입이 다른 클래스를 상속하고 있는 경우
베이스 클래스의 생성자가 호출되기 전에 멤버에 대한 초기화가 이루어진다는 것이다.
멤버 변수의 초기화 순서는 변수의 선언 순서대로 수행된다.
* 멤버 초기화 구문을 사용하지 않는 것이 좋은 경우
1. 객체를 0이나 null로 초기화하는 경우
- 시스템 초기화 루틴은 저수준에서 직접 CPU 명령을 수행하여 메모리 블록을 0으로 설정한다.
C# 컴파일러는 이같이 불필요한 초기화 구문이 있더라도 코드를 생성할 것이므로 괜히 두 번 동작하는 모습이 되어버린다.
MyValueType maVal1; //0으로 자동 초기화된다.
MyValueType maVal2 = new MyValueType(); //반복해서 0으로 초기화
두 번째 문장의 경우 박싱/언박싱된 myVal2 변수 모두에 대해서 0으로 초기화하는 과정이 수행된다. <<??
이 과정으로 인해 약간의 추가 시간이 소요된다.
2. 동일한 객체를 반복해서 초기화하는 경우
public class MyClass2
{
private List<string> labels = new List<string>();
MyClass()
{
}
MyClass2(int size)
{
labels = new List<string>(size);
}
}
이 경우 MyClass2를 생성할 때 컬렉션 크기를 지정하게 되면 2개의 List<> 객체가 생성되며 하나는 즉시 가비지가 된다.
멤버 초기화 구문은 생성자의 본문보다 앞서 수행되므로 생성자 본문에서 생성한 객체만 살아남는다.
3. 예외 처리가 반드시 필요한 경우
멤버 초기화 구문은 try로 감쌀 수 없기 때문에 초기화 과정에서 예외가 발생하면 클래스 내부에서 복구를 시도할 수 없다.
예외 처리가 필요하다면 반드시 생성자 내부로 초기화 코드를 옮기고 예외 처리 구문을 구현해야 한다.
+ 멤버 초기화 구문은 모든 생성자가 동일한 방버으로 멤버 변수를 초기화하는 경우에 한해서 사용해야 한다.