[Effective C# item 2] const보다는 readonly가 좋다

1. 참조

2. 소개

  • C#에서는 컴파일타임 상수와 런타임 상수가 있습니다.
  • 결론부터 말씀드리면 컴파일타임 상수보다는 런타임 상수를 사용하는 편이 좋습니다.
  • 컴파일타임 상수가 약간 더 빠르긴 하더라도 성능면에서 차이가 크지 않고 런타임 상수를 사용하여 얻을 수 있는 유연성 이라는 장점은 큰 이득입니다.
  • 그래서 컴파일타임 상수는 성능이 중요하고 상수의 값이 절대로 어떤 경우에도 바뀌지 않을 때 사용해야 합니다.

런타임상수는 readonly 키워드를 사용하고, 컴파일타임 상수는 const 키워드를 사용합니다.

// 컴파일타임 상수 :
public const string MyName = "beombeomjojo";

// 런타임 상수 :
public static readonly MyName2 = "beombeomjojo";

3. const

  • 컴파일타임 상수 입니다.
  • 컴파일타임에 변수가 값으로 대체되어, 메서드 내부에서도 선언이 가능합니다.
  • 컴파일타임에 상수를 리터럴로 대체해야 하기 떄문에, 내장된 숫자형, enum, 문자열, null과 같은 내장 자료형만 사용 가능합니다.

4. readonly

  • 런타임 상수입니다.
  • 컴파일 타임에 값으로 대체되는 것이 아닌, 상수에 대한 참조 로 컴파일 되어 메서드 내에서는 선언이 불가능합니다.
  • 반드시 생성과 동시에 초기화하지 않아도 되며, 생성자에서 최초 1번 초기화 가능합니다. 그 이후에는 수정이 불가능 합니다.
  • 어떤 타입과도 사용될 수 있다는 장점이 있습니다.

핵심

  • readonly 키워드를 사용한 런타임 상수는 컴파일 타임에는 상수에 대한 참조로 컴파일 되고 런타임에 값이 평가됩니다.
  • const 키워드를 사용한 컴파일타임 상수는 컴파일타임에 값으로 대체됩니다.
  • 이러한 차이로 인해 const 상수는 상수 타입에 한계를 가지게 되고 readonly 상수는 좀더 다양한 타입을 상수로 가질 수 있다는 차이가 있습니다.

정리

  • readonly 키워드를 사용하면 타입의 폭이 넓다는 장점과 호환성에 유리하다는 장점이 있습니다.
  • 즉, 유연성에서 readonly 상수가 const 상수에 비해 많이 유리합니다.
  • 하지만, 성능이 매우 중요한 때는 const 상수를 써주는게 좋고, 컴파일할 때 사용되는 상수값을 정의할 때도 반드시 const를 사용해야 합니다.
  • 예시로 Attribute의 매개변수, switch/case 문의 Label, enum 정의 시에는 컴파일 시에 사용되므로 const를 통해서 초기화 되어야 합니다.
  • 이러한 경우를 제외한 나머지의 상수는 readonly로 사용하는 것이 좋습니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY