2010. 3. 29. 18:35

const vs 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 에 있는 샘플 코드 입니다.







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);
      }
   }
}

Program1Program2 네임스페이스는 별도로 컴파일된 두 프로그램을 나타냅니다. 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);

      }
   }
}
이 코드에 결과는 2,1 입니다. 두번째 Program3.Utils.X 값을 2로 변경하고 Program1 과 Program3를 컴파일해서 돌린다면 결과는 2,1 입니다. Program2 를 컴파일 하기 전까지 const 값은 변경된 내용이 반영되지 않습니다.

'.NET > C#' 카테고리의 다른 글

ReadLine, Read, ReadKey  (0) 2010.04.03
어셈블리 동적 로딩  (0) 2010.03.31
Sealed  (0) 2010.03.29
Sort메소드  (0) 2010.03.28
Delegate-2  (0) 2010.03.27
Posted by 아몰라