※ 공부한 내용을 기록하기 위해 작성한 글이기 때문에 틀린 부분이 있을 수 있습니다.
예전에 const보다 readonly가 더 좋다는 글을 본적이 있어서 const 대신 readonly를 사용해왔었다. 하지만 어떤 점에서 더 좋은지를 모르고 사용했기 때문에 이번에 내용을 정리해보고자 한다.
const와 readonly 키워드
책 (Effective c#)에서 말하길 컴파일타임 상수(const)는 런타임 상수(readonly)에 비해 약간 더 빠르긴 하지만 유연성이 떨어지기 때문에 const보다는 readonly를 사용하는게 좋다고 한다. 이 내용을 생각해보기 MSDN에 있는 const와 readonly 키워드에 대한 설명부터 보고 가도록 한다.
상수 - C# 프로그래밍 가이드
C#의 상수는 컴파일 시간 리터럴 값이며 프로그램이 컴파일된 후에는 변경되지 않습니다. C# 기본 제공 형식만 상수가 될 수 있습니다.
docs.microsoft.com
정리하자면 const는 상수를 나타내기 위한 한정자로 컴파일 시간에 값이 결정되면 절대 변하지 않는 값을 나타내기 위해 사용한다. readonly는 읽기 전용 필드로 생성자에서 값을 여러번 할당 및 재할당할 수 있고 생성자가 종료된 후에는 값을 할당할 수 없는 필드를 말한다.
MSDN의 정의와 책에서의 설명을 비교해보면 의문이 드는것이 있다. 책에서는 readonly를 런타임 상수라고 했는데 MSDN에서는 읽기 전용 필드라고 말하고 있다. 그래서 MSDN에 런타임 상수에 대해 찾아봤더니 아무런 내용이 없었다. readonly에 '런타임 상수에 사용될 수 있다' 라고 쓰여있긴 했지만, reaonly가 런타임 상수라는 말은 아니다. 그럼 런타임 상수는 도대체 뭘까??
stackoverflow에서 나와 같은 생각을 했던 사람의 글을 찾을 수 있었다.
const vs. readonly
Today I found an article where a const field is called compile-time constant while a readonly field is called runtime constant. The two phrases come from 《Effective C#》. I searched in MSDN and the
stackoverflow.com
※ 여기부터는 개인적인 생각입니다.
런타임 상수라는게 있는 개념인지는 모르겠지만 상수는 값이 정해지면 변경될 수 없다는 뜻을 가지고 있기 때문에 런타임 상수는 상수의 정의에 어긋난다. 하지만 읽기 전용 필드는 런타임(생성자)에서 값을 할당하기 때문에 런타임 상수 '처럼' 사용할 수 있다는 것 같다.
어쨌거나 const와 readonly는 값이 할당되는 시점이 다르긴 하지만 값을 변경할 순 없다는 공통점을 가진다. 그럼 왜 readonly가 더 유연한지 생각해보자.
readonly의 유연성
상수는 기본적으로 c#의 기본 제공 형식만 const로 선언할 수 있고 클래스, 구조체, 배열 등은 const가 될 수 없다.
하지만 readonly는 기본 제공 형식, 배열, 클래스, 구조체 등 어떤 타입과도 함께 사용될 수 있다.
readonly는 생성자에서 값을 할당하기 때문에 같은 클래스의 인스턴스라도 서로 다른 값을 가질 수 있다.
또한 const는 다른 어셈블리의 const 값을 참조하는 경우 해당 어셈블리의 값이 변경되어도 기존 어셈블리를 다시 컴파일하지 않는 이상 값이 변경되지 않는 문제가 발생할 수 있다.
이 내용은 아래의 링크에서 확인 할 수 있다.
Const vs Readonly in C#
This article explains const vs readonly in C#. Basic difference between const vs readonly is that one needs to be assigned a value at compile time and the other at run time.
www.c-sharpcorner.com
이러한 이유들 때문에 const보다 readonly를 사용하는 것이 좋다고 한다.
2024.09.18
제목은 'const보다 readonly가 더 좋은 이유' 라고 했지만 readonly만 써야 되는건 아니다.
유연성 때문에 readonly가 더 유리하긴 하겠지만 유연성이 필요없는 경우라면 const를 쓰는 것이 더 유리할 수 있다.
예를 들어 값이 절대 변하지 않는 경우 const 키워드를 사용한다면 해당 값은 절대 변하지 않는 상수 라는 것을 쉽게 파악할 수 있다.
또한 const는 컴파일 할 때 값이 결정되므로 코드 최적화에도 유리하다
const int MULTIPLIER = 5;
int result = MULTIPLIER * 10;
이런 문장이 있다면 컴파일 시점에 result 값이 결정되므로 런타임에 추가적인 연산이 필요 없게 된다고 한다.
결론
readonly가 const의 완벽한 상위호환의 개념이 아니기 때문에 각 키워드의 목적에 맞게 사용하는 것이 중요하다.
'C#' 카테고리의 다른 글
[C#] Excel 파일의 데이터 읽어오기 (0) | 2024.11.09 |
---|---|
[c#] 별 출력하기 (0) | 2022.04.19 |
bool의 크기는 왜 1byte일까? (0) | 2022.04.19 |