본문 바로가기
책/Effective C#

Effective C# - Item2 const보다는 readonly가 좋다.

by 코딩하는 돼징 2023. 10. 27.
반응형

Item2 const보다는 readonly가 좋다.

컴파일타임 상수(const)

상수의 값은 이미 코드를 컴파일할 때 결정된다. 따라서 런타임에 값이 변경되지 않고 상수로 사용된다. 그러므로 상수 값을 사용할 때 추가적인 평가나 계산이 필요하지 않다.

이는 주로 attribute의 매개변수, switch/casw문의 레이블, enum정의시 사용하는 상수 등에 사용된다.

// Millennium을 사용하는 모든 곳에서 컴파일러난 이를 200으로 대체한다.
cosnt int Millennium = 200;

값이 변경되었을 경우

응용 프로그램 전체를 다시 빌드해야한다. 변경된 const값은 새로운 컴파일 시점에 반영되기 떄문이다. 이는 변경사항이 생겼을때 소스 코드에서 값을 직접 수정하고 다시 컴파일 한 후 프로그램을 다시 빌드한 후 새로운 어셈블리를 배포해야한다.

 

컴파일타임 상수를 사용하면 성능이 빠르다. 변수를 통해 값을 참조하는 것보다 빠를 수 밖에 없다. 하지만 이는 성능개선 효과가 크지 않고 유연성에 대한 단점이 존재한다.


런타임 상수(readonly)

컴파일 과정에서 값이 결정되지 않고 런타임중에 값이 평되며 이는 일반 변수와 다르게 생성자를 통해 초기화 될때 값을 결정하며 이후에는 변경할 수 없다.런타임 상수 같은 경우 모든 타입에 사용할 수 있다.

class Age
{
    private readonly int _year;
    Age(int year)
    {
        _year = year;
    }
    void ChangeYear()
    {
        //_year = 1967; // Compile error if uncommented.
    }
}

값이 변경되었을 경우

만약 readonly 필드를 변경해야한다면, 해당 어셈블리 또는 클래스를 변경한 후에 배포해야한다. 해당

필드 사용하는 부분만 변경된 코드를 사용하도록 재빌드 하고 배포할 수 있다. 이는 전체 어셈블리 또는 클래스를 다시 배포할 필요가 없다. 또한 변경된 readonly 상수는 해당 필드를 사용하는 코드도 변경하도록 한다. 새 값을 반영하도록 코드를 수정해야 한다.

class Age
{
    private readonly int _year;
    Age(int year)
    {
        _year = year;
    }
    public void DisplayMessage()
    {
        Console.WriteLine(_year);
    }
}
public class Program
{
    static void Main()
    {
        Age age = new Example(2222);
        age.DisplayMessage(); // 2222 출력

        // age._year = 3333; // 컴파일 오류: readonly 필드는 변경 불가능

        Age age = new Example(3333);
        age.DisplayMessage(); // 3333 출력
    }
}

 

결론

몇 가지 예외적인 상황을 제외한다면 대부분의 경우 const보다는 readonly를 사용하는 것이 좋다.

 

 

 

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

반응형

댓글