상수가 뭐야? 🧐

상수(常數, constant)란 수식에서 변하지 않는 값을 뜻한다. 이것은 변하는 값 변수와 반대이다.

종류는 뭐가 있을까? 🧐

  1. const
  2. readonly
  • 값 형식: 데이터자체임으로 필드 변경이 불가능 하다.
  • 참조 형식: 데이터에 대한 참조이기 때문에 참조 개체 자체는 변경이 불가능 하지만 개체가 만약 클래스 인스턴스라면 멤버 변수를 바꾸는 것은 가능하다.

💚 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Program
  {
      private readonly static Test test = new Test();
      static void Main(string[] args)
      {
          //개체 참조를 바꾸는 것은 불가능
          test = test1;//오류!!!
          //개체 내 필드를 바꾸는 것은 가능!
          test.value1 = 3;
      }
  }
  class Test
  {
      public int value1 = 1;
  }

차이점에 대해 알아보자! 🧐

readonly 키워드는 const 키워드와 다릅니다. const 필드는 필드 선언에서만 초기화될 수 있습니다. readonly 필드는 선언이나 생성자에서 초기화될 수 있습니다. 따라서 readonly 필드는 사용된 생성자에 따라 다른 값을 가질 수 있습니다. 또한 const 필드가 컴파일 시간 상수라고 하더라도 readonly 필드는 다음 줄에서와 같이 런타임 상수에 사용될 수 있습니다.

💛 컴파일 타임 상수: 컴파일할 때 정해지는 상수. -> 선언때만 초기화가 가능!!!

💛 런타임 상수: 런타임에 정해지는 상수. -> 그래서 생성자에서 값을 초기화가 가능!!!!!

💚 예시

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Program
{
    static void Main(string[] args)
    {
        TestClass test = new TestClass(20);
        //const: 클래스에 멤버변수 중 canst변수가 있다면 static변수 처럼 작동함!(단 하나!)
        //readonly: 클래스 인스턴스 마다 각자 다른 값을 가질 수 있음.
        Console.WriteLine($"ValueA: {TestClass.ValueA}, ValueB: {test.ValueB}");
    }
}
class TestClass
{
    //const는 선언 때 값을 초기화해주어야 함.
    public const int ValueA = 10;
    //readonly는 선언때 초기화를 안해줘도 됨.
    public readonly int ValueB;
    //readonly는 생성자에서 초기화가 가능.
    //const는 생성자에서도 불가능 하다.
    public TestClass(int value)
    {
        ValueB = value;
    }
    public void Method(int value)
    {
        //둘 다 초기화후에는 값 변경이 불가능 하다!
        ValueB = value; //빨간밑줄
        ValueA = value;//빨간밑줄
        //const는 메소드 안에서 선언 가능
        const int valueC = 1;
        //readonly는 불가능 하다.

        readonly int valueD //빨간밑줄
    }
}