아이템 12 : 할당 구문보다 멤버 초기화 구문이 좋다
- 클래스 생성자 내에서 멤버 변수들을 초기화하도록 작성하다 보면 모든 생성자 내에서 멤버 변수들을 초기화해야 함에도 불구하고 자칫 초기화 코드를 누락하는 경우가 있다. 이러한 오류를 범하지 않으려면 생성자의 본문에서 멤버 변수의 값을 할당하기보다 멤버 초기화 구문 member Initializer 를 사용하는 것이 좋다.
1
2
3
4
5
| public class MyClass
{
//컬렉션을 선언하는 동시에 초기화
private List<string> labels = new List<string>(); //멤버 변수를 올바르게 초기화
}
|
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
29
30
31
32
33
34
35
| public struct MyValue
{
public int value;
public MyValue(int val) { value = val; }
}
public class MyClass2
{
MyValue myVal1; //0으로 초기화
MyValue myVal2 = new MyValue(); //반복해서 0으로 초기화
//이 코드의 두 문장은 모두 변수를 0으로 초기화한다.
//첫 번째 문장은 myVal1 이 사상된 메모리 블록은 모두 0으로 설정한다.
//두 번째 문장은 initObj라는 IL 명령을 사용하는데 박싱/언박싱 된 myVal2 변수 모두에 대해서 0으로 초기화한다.
//이 과정으로 인해 약간의 추가 시간이 소요된다.
}
public class MyClass3
{
//컬렉션을 선언하는 동시에 초기화
private List<string> labels = new List<string>(); //멤버 변수를 올바르게 초기화
public MyClass3() { }
public MyClass3(int size)
{
labels = new List<string>(size);
//만약 이 생성자를 호출하게 되면, 실제로 2갱의 List<> 객체가 생성되며 그 중 하나는 즉각 가비지가 된다.
//불필요한 코드가 포함된 꼴이다.
//풀어쓰면
//labels = new List<string>();
//labels = new List<string>(size);
}
}
|
댓글
댓글 쓰기