[C#] 상수 배열은 어떻게 할까? Const Array? , (''에 할당할 식은 상수여야 합니다.)

C# 상수 배열

C# 상수 배열

상수 배열은 어떻게 할까? const array , (''에 할당할 식은 상수여야 합니다.)에 대한 해결 방법을 알아보도록 합시다.

일반적으로 고려할 수 있는 상수 할당입니다. 할당 시 문제가 없습니다.

//상수 문제 없음
        const string CONST = "Constant";

리드온리로 배열을 할당해 보았습니다. 문제 없이 컴파일이 되는 것을 확인할 수 있습니다.

readonly string[] CONSTS_R = { "R1", "R2" };

다만, C#에서 할당할 식은 상수 배열이 될 수 없습니다. 상수 배열을 설정하려고 시도하면 컴파일러에서 다음과 같은 오류가 발생합니다.

//오류, CS0133, 'ViewBeomSang.CONSTS_C'에 할당할 식은 상수여야 합니다.
        const string[] CONSTS_C = { "C1", "C2" };

요약하면, C# 에서 배열은 상수가 될 수 없습니다. 개발자의 의도는 배열내부의 각 객체를 상수로 선언 하라고 지시하는 것이지만, 실제로 컴파일러는 배열내부가 아니라 배열자체로 상수여부를 판단하여 그런 게 아닐까 싶습니다.

그렇기에 C#에서 상수 배열은 readonly 를 사용하시면 됩니다. 필요시 static 한정자를 추가해 주십시오.

C# Const Array

C#에서 상수 배열을 선언할 때 흔히 const 키워드를 사용하려는 시도가 있지만, const는 컴파일 시간에 결정된 값을 필요로 하기 때문에 배열을 상수로 선언할 수 없습니다. 😣 배열은 런타임에 초기화되는 값이기 때문에 이러한 방식으로는 컴파일 오류가 발생합니다.

예를 들어, 다음과 같은 코드가 있다고 가정해 봅니다.

public const string[] Values = { "Value1", "Value2", "Value3", "Value4" };

이 코드는 컴파일되지 않고 오류를 발생시킵니다. 이는 배열의 값이 컴파일 타임에 확정되지 않기 때문입니다. 그럼 어떻게 해결할 수 있을까요?

이러한 문제를 해결하기 위해 C#에서는 readonly 키워드를 사용하는 것이 적합합니다. readonly는 변수 또는 필드가 초기화된 이후에는 값이 변경되지 않도록 보장하는 키워드입니다. 따라서 배열과 같은 참조 타입을 상수처럼 다룰 수 있는 방법을 제공합니다.

다음 예제를 통해 readonly 키워드를 활용해 상수 배열을 선언하는 방법을 살펴보겠습니다:

using System; namespace ConstantArrayExample { class Program { // readonly로 배열 선언 public static readonly string[] Values = { "Value1", "Value2", "Value3" }; static void Main(string[] args) { // 배열 요소 출력 foreach (var value in Values) { Console.WriteLine(value); } } } }

위 코드에서 Values 배열은 readonly로 선언되어 있기 때문에 프로그램이 실행되는 동안 값이 수정될 수 없습니다. 이는 마치 상수처럼 동작하게 되는 것입니다.

상수 배열

  • const 키워드는 배열과 같은 참조 타입에 사용할 수 없습니다. 이는 상수가 반드시 컴파일 타임에 값이 결정되어야 하기 때문입니다.
  • readonly 키워드는 배열과 같은 참조 타입에서 '불변'을 보장합니다. 즉, 초기화 후에는 값을 수정할 수 없게 되어 배열을 안전하게 사용할 수 있습니다.
  • readonly는 런타임에 값을 초기화할 수 있다는 점에서 유연성이 있습니다. 그럼에도 초기화된 이후에는 상수처럼 사용될 수 있기 때문에, 배열과 같은 자료형에 적합합니다.

결과적으로, C#에서 배열을 상수처럼 사용하려면 readonly 키워드를 사용해야 오류 없이 원하는 기능을 구현할 수 있습니다. 이렇게 하면 런타임에서도 상수처럼 동작하는 배열을 안전하게 사용할 수 있어요~

댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗