const vs readonly
컴파일타임 상수는 런타임 상수에 비해 다소 빠르지만 유연성이 떨어진다. 컴파일 타임 상수는수행성능이 매우 중요하고 상수값이 절대로 바뀌지 않는 경우에 한해서만사용하는 것이 좋다.
컴파일 타임 상수는 단지 내장자료형(정수형, 실수형) 이나 enum, string 에 대해서만 사용될수 있다. 이는 내장 자료형만이 유일하게 변수의 초기화 단계에서의 의미를 가지고 문자 자체로 표현되는 값(literal value)을 대체할 수 있기 때문이다.
장단점
readonly 대신 const 를 썼을 때의 유일한 장점은 수행성능이다. 이미 알려진 상수값에 직접 접근하는 효율이 readonly로 지정된 변수의 값을 참조하는 것에 비해서 조금 더 빠르다.그렇지만 이를 통해 얻을수 있는 수행성능의 개선효과가 작고 무엇보다 유연성을 감소시키는 단점이 있다. 유연성을 포기하기 이전에 수행성능에 미치는 영향을 먼저 명확하게 하자.
readonly 키워드는 const 키워드와 다릅니다. const 필드는 필드를 선언할 때만 초기화될 수 있습니다. readonly 필드는 필드를 선언할 때 또는 생성자에서 초기화될 수 있습니다. 따라서 readonly 필드의 값은 사용된 생성자에 따라 다릅니다. 또한 const 필드는 컴파일 타임 상수인 반면 readonly 필드는 다음 예제에서와 같이 런타임 상수로도 사용할 수 있습니다.
출처 : msdn.microsoft.com
컴파일 타임 상수 vs 런타임 상수
컴파일 타임 상수는 코드가 컴파일될 때 계산되고 런타임 상수는 응용 프로그램이 실행되는 동안에만 계산됩니다. 컴파일 타임 상수는응용 프로그램 실행에 관계없이 항상 같은 값을 갖지만 런타임 상수는 매번 변경될 수 있습니다. 컴파일 타임 상수는 배열 범위,case 식 또는 열거자 이니셜라이저 등의 경우에 필요합니다.
출처 : msdn.microsoft.com
컴파일타임 상수는 런타임 상수에 비해 다소 빠르지만 유연성이 떨어진다. 컴파일 타임 상수는수행성능이 매우 중요하고 상수값이 절대로 바뀌지 않는 경우에 한해서만사용하는 것이 좋다.
컴파일 타임 상수는 단지 내장자료형(정수형, 실수형) 이나 enum, string 에 대해서만 사용될수 있다. 이는 내장 자료형만이 유일하게 변수의 초기화 단계에서의 의미를 가지고 문자 자체로 표현되는 값(literal value)을 대체할 수 있기 때문이다.
출처 : Effective C#
readonly 대신 const 를 썼을 때의 유일한 장점은 수행성능이다. 이미 알려진 상수값에 직접 접근하는 효율이 readonly로 지정된 변수의 값을 참조하는 것에 비해서 조금 더 빠르다.그렇지만 이를 통해 얻을수 있는 수행성능의 개선효과가 작고 무엇보다 유연성을 감소시키는 단점이 있다. 유연성을 포기하기 이전에 수행성능에 미치는 영향을 먼저 명확하게 하자.
출처 : Effective C#
즉 const 로 선언한것은 변경을 하더라도 전체 컴파일 전까지는 반영된 내용이 적용되지 않습니다. 즉 const 로 선언한것을 수정할 경우는 재컴파일 하지 않고 배포한다면 원하는 결과는 나오지 않기 때문에 변경에 빈도가 있는 것은 const 를 사용하지 않는것이 좋습니다.
역시 코드를 보는게 이해하기 쉽겠죠 ?? 밑에 내용은 msdn 에 있는 샘플 코드 입니다.
using System;
namespace Program1
{
public class Utils
{
public static readonly int X = 1;
}
}
namespace Program2
{
class Test
{
static void Main() {
Console.WriteLine(Program1.Utils.X);
}
}
}
역시 코드를 보는게 이해하기 쉽겠죠 ?? 밑에 내용은 msdn 에 있는 샘플 코드 입니다.
C# 언어 사양
10.4.2.2 상수 및 정적 읽기 전용 필드의 버전 관리상 수와 읽기 전용 필드의 이진 버전 관리 의미는 다릅니다. 식에서 상수를 참조할 경우 컴파일 타임에 상수 값을 가져오지만, 식에서 읽기 전용 필드를 참조할 경우 런타임까지 필드 값을 가져오지 않습니다. 별개의 두 프로그램으로 구성된 응용 프로그램을 살펴보겠습니다.
using System;
namespace Program1
{
public class Utils
{
public static readonly int X = 1;
}
}
namespace Program2
{
class Test
{
static void Main() {
Console.WriteLine(Program1.Utils.X);
}
}
}
Program1 및 Program2 네임스페이스는 별도로 컴파일된 두 프로그램을 나타냅니다. Program1.Utils.X를 정적 읽기 전용 필드로 선언했기 때문에 Console.WriteLine 문에서 출력하는 값을 컴파일 타임에 알 수 없으며, 런타임에 해당 값을 가져옵니다. 따라서 X 값이 변경되고 Program1이 다시 컴파일되면 Program2가 다시 컴파일되지 않더라도 Console.WriteLine 문이 새 값을 출력합니다. 그러나 X가 상수였기 때문에 Program2를 컴파일 할 때 X 값을 가져오며, Program2를 다시 컴파일할 때까지 Program1의 변경으로 인해 영향을 받지 않습니다.
출처 : msdn.microsoft.com
즉 program1 에 x 를 2로 변경후 Program1 만 컴파일 한다면 Program2 에서 찍어보는값은 변경이 적용된 값입니다.
여기서 program1 에 x 값은 2로 변경한 값을 유지하고 Program3 을 추가하고 Program2 다음과 같이 변경했다고 가정해봅시다.
namespace Program3
{
public class Utils
{
public const int X = 1;
}
}
namespace Program2
{
class Test
{
static void Main() {
Console.WriteLine(Program1.Utils.X);
Console.WriteLine(Program3.Utils.X);
}
}
}
여기서 program1 에 x 값은 2로 변경한 값을 유지하고 Program3 을 추가하고 Program2 다음과 같이 변경했다고 가정해봅시다.
namespace Program3
{
public class Utils
{
public const int X = 1;
}
}
namespace Program2
{
class Test
{
static void Main() {
Console.WriteLine(Program1.Utils.X);
Console.WriteLine(Program3.Utils.X);
}
}
}
이 코드에 결과는 2,1 입니다. 두번째 Program3.Utils.X 값을 2로 변경하고 Program1 과 Program3를 컴파일해서 돌린다면 결과는 2,1 입니다. Program2 를 컴파일 하기 전까지 const 값은 변경된 내용이 반영되지 않습니다.

스타는 미쳤다






최근 덧글