본문 바로가기
책/Effective C#

Effective C# - Item14 초기화 코드가 중복되는 것을 최소화하라

by 코딩하는 돼징 2023. 12. 3.
반응형

C# 컴파일러는 공용 생성자를 이용하는 초기화 방식을 매우 특별한 문법으로 인식한다. 변수에 대한 중복 초기화 코드를 제거해줄 뿐 아니라 베이스 클래스의 생성자가 반복적으로 호출되는 것도 막아준다. 즉 객체 초기화를 위해 수행해야 하는 코드를 최적화해준다. 개발자 입장에서는 초기화 과정 일부를 공용 생성자에 위임할 수 있으므로 작성하는 코드의 양을 최소활 할 수 있다.


1. Constructor Chaining

여러 생성자 중에서 가장 많은 입력을 필요로 하는 생성자를 기준으로 하여, 입력할 값의 수가 적은 다른 생성자들을 이 기준이 되는 생성자를 통해 간접적으로 호출하는 기법이다. 이를 통해 코드의 중복을 최소화하고 재사용성을 높일 수 있다.

 

Unity - Constructor Chaining(생성자 체이닝)

Constructor Chaining 여러 생성자 중에서 가장 많은 입력을 필요로 하는 생성자를 기준으로 하여, 입력할 값의 수가 적은 다른 생성자들을 이 기준이 되는 생성자를 통해 간접적으로 호출하는 기법이

code-piggy.tistory.com


2. 기본 매개변수(default paremeter)

C# 4.0이후에 추가된 기본 매개변수(default paremeter)기능을 사용하면 여러 생성자를 하나의 생성자로 대체할 수 있다. 기본 매개변수를 사용하면 특정 매개변수에 값을 제공하지 않으면 컴파일러가 해당 매개변수에 대해 기본값을 사용한다. 이를 통해 여러 생성자를 간단히 하나로 통합할 수 있다.

class Piggy
{
    string name = "";
    int weight = 0;

    // 기본 생성자
    public Piggy(string name = "", int weight = 0)
    {
        this.name = name;
        this.weight = weight;
    }
}

 

 


C#에서 객체 초기화 및 인스턴스 생성 과정

클래스 자체에 대한 초기화 작업은 한번만 수행

01 정적 변수의 저장 공간을 0으로 초기화

static 변수는 해당 타입이 처음으로 사용되는 시점에 초기화 된다.

02 정적 변수에 대한 초기화 구문 수행

정적 변수에 초기값이 명시되어 있으면 해당 값으로 초기화 된다.

03 베이스 클래스의 정적 생성자 수행

만약 현재 클래스가 다른 클래스를 상속하고 있다면 상속된 클래스의 정적 생성자가 호출된다.

04 정적 생성자 수행

현재 클래스의 정적 생성자가 호출된다. 정적 생성자는 클래스의 정적 멤버를 초기화하는데 사용된다.


동일한 타입으로 추가 인스턴스를 생성되는 경우 밑에 과정 반복

01 인스턴스 변수의 저장 공간을 0으로 초기화

객체가 생성되면 해당 객체의 모든 인스턴스 변수는 해당 타입의 기본 값으로 초기화 된다.(숫자는 0, 참초 타입은 null)

02 인스턴스 변수에 대한 초기화 구문 수행

사용자가 정의한 생성자에서 명시적으로 인스턴스 변수를 초기화할 때 해당 초기화 구문이 실행된다.

03 적절한 베이스 클래스의 인스턴스 생성자 수행

현재 클래스가 다른 클래스를 상속하고 있다면 상속된 클래스의 인스턴스 생성자가 호출된다. 이때 베이스크 클래스의 인스턴스 생성자는 해당 클래스의 인스턴스 변수를 초기화시킨다.

04 인스턴스 생성자 수행

현재 클래스의 인스턴스 생성자가 호출된다. 사용자가 정의한 생성자 내에서 추가적인 초기화 작업을 수행할 수 있다.

 

컴파일러가 생성자 내에 중복된 멤버 초기화 코드를 생성하지 않도록 6단계와 7단계는 최적화 되어 있다.


C#에서는 객체가 생성될 때 모든 멤버가 초기화되는 보장이 있다. 이때 초기화는 해당 타입의 기본값으로 이루어지며, 숫자형은 0, 참조 타입은 null, 논리형은 false 등이 해당 타입의 기본값에 해당한다. 생성자를 작성할 때 주의해야 할 점은 멤버를 가능한 한 번만 초기화해야 한다.

이를 위해서 단순한 리소스의 경우 멤버 초기화 구문을 이용하고 복잡한 초기화 과정이 필요한 경우에만 생성자를 사용하는 것도 좋은 방법이다. 또한 코드의 중복을 피하기 위해서 공통적인 초기화 작업을 수행하는 공용 생성자를 작성하고 이 생성자를 이용하는 방식을 사용하기 바란다.

 

 

 

 

본 게시글은 Effective C#을 읽고 정리하였습니다.

 

 

반응형

댓글