티스토리 뷰
[Effective C# Item 12] 할당 구문보다 멤버 초기화 구문이 좋다
C# 코딩을 하다보면 클래스를 생성할 때 생성자를 2개 이상 작성해야 할 경우도 있다. 이 때 생성자 내에서 멤버 변수들의 값을 초기화하도록 코딩하다 보면 모든 생성자에서 초기화를 해줘야 하는데 자칫 멤버 변수 초기화 코드가 누락될 수 있다. 이런 실수를 하지 않으려면 멤버 초기화 구문(member initializer)를 사용하는 것이 좋다.
멤버 초기화 구문(member initializer)
위 예제가 바로 멤버 초기화 구문이다. 위와 같이 코딩을 하면 MyClass 타입에서 몇 개의 생성자를 작성하든 상관없이 멤버 변수를 올바르게 초기화할 수 있다.
멤버 초기화 구문에 의해 생성된 코드는 생성자 본문의 앞쪽에 붙여진다. 이는 생성하려는 타입이 다른 클래스를 상속하는 경우에도 베이스 클래스의 생성자가 호출되기 전에 멤버에 대한 초기화가 이루어진다는 것이다.
멤버 초기화 구문을 사용하지 않는 것이 좋은 경우
멤버 초기화 구문도 항상 써도 되는 것은 아니다. 다음은 멤버 초기화 구문을 사용하지 않는 것이 좋을 때이다.
1. 객체를 0이나 null로 초기화하는 경우
기본 시스템 초기화 루틴은 코드를 실행하기 전에 모든 값을 0으로 설정한다. 이와 같이 저수준의 시스템 초기화 루틴에서 이미 변수의 값을 0으로 설정하기 때문에 추가적으로 변수를 0이나 null로 설정할 필요가 없다.
위 코드의 MyValType 멤버 변수 선언은 둘 다 0으로 초기화하게 되는데 두 번째 문장은 initobj라는 IL 명령을 사용하는데 박싱/언박싱된 myVal2 변수 모두에 대해서 0으로 초기화하는 과정이 수행되어 약간의 추가 시간이 소요된다.
2. 동일한 객체를 반복해서 초기화하는 경우
멤버 초기화 구문은 객체 생성 방법이 모든 생성자에서 동일한 경우에만 사용하는 것이 좋다. 아래와 같이 List 객체를 생성하는 방식이 다양하게 존재할 경우 멤버 초기화 구문을 사용하지 않는 것이 좋다.
위와 같이 작성할 경우 int 변수 하나를 매개변수로 가지는 생성자가 호출 될 경우 이미 생성되어 있는 labels의 객체가 즉각 가비지가 된다.
3. 멤버 초기화할 때 예외 처리가 필요한 경우
멤버 초기화 구문은 try로 감쌀 수 없기 때문에 초기화 과정에서 예외가 발생하면 예외가 외부로 전파된다. 이 경우 생성자 내로 초기화 구문을 옮기고 예외 처리 코드를 적용하는 것이 좋다.
정리
멤버 초기화 구문을 이용하면 타입 내에 생성자가 여러 개일 때도 멤버 변수 초기화를 누락할 실수를 없애준다. 그리고 나중에 생성자를 추가하는 경우에도 멤버 변수 초기화를 누락하는 상황을 방지할 수 있다.
하지만 모든 생성자가 동일한 방법으로 멤버 변수를 초기화하는 경우에만 멤버 초기화 구문을 사용해야 한다.
멤버 초기화 구문을 사용하면 코드를 읽기도 쉽고 유지보수하기도 편하다.
지금까지 혼재해서 쓰고 있었던 거 같다..고쳐 쓰자
참조 - Effective C# <강력한 C# 코드를 구현하는 50가지 전략과 기법, 이펙티브>, 빌 와그너, 김명신, 한빛미디어
'Programming > Effective C#' 카테고리의 다른 글
[Effective C# Item 14] 초기화 코드가 중복되는 것을 최소화해라 (0) | 2020.10.18 |
---|---|
[Effective C# Item 13] 정적 클래스 멤버를 올바르게 초기화하라 (0) | 2020.10.18 |
[Effective C# Item 11] .NET 리소스 관리에 대한 이해 (0) | 2020.10.18 |
[Effective C# Item 10] 베이스 클래스가 업그레이드된 경우에만 new 한정자를 사용하라 (0) | 2020.10.18 |
[Effective C# Item 9] 박싱과 언박싱을 최소화하라 (0) | 2020.10.18 |