C#/문법 정리

C# - 상수(const)와 readonly

Khadra 2024. 7. 14. 08:44

상수(const)

  • 변하지 않는 값이다.
  • 예를 들어, 길이를 나타내는 단위 중에 미터와 야드가 있다.
    1미터는 1.09361 야드이다. 이 값은 변하지 않으므로 상수이다.
  • const 키워드로 선언된 상수를 바꾸려고 컴파일 시 에러가 나온다.
    즉, 프로그래머가 실수로라도 바꾸지 못하게 한다.
  • 예시
    const double meterToYard = 1.09361;

readonly

  • C#에는 "읽기전용"이라는 뜻이다.
  • readonly 키워드를 붙인 변수는 변수를 선언하는 시점과 생성자 메소드에서만 값을 변경할 수 있다.
  • 그 외의 경우에 변경하면 오류가 발생한다.

const와 readonly의 차이점

const readonly
선언될 때 값이 할당된다. 실행될 때 또는 객체가 생성자에 의해 초기화될 때 값이 할당된다.
"Classname.VariableName"으로 사용해야 한다. "InstanceName.VariableName"으로 사용해야 된다.
컴파일 시에 값이 결정된다. 런타임 시에 값이 결정된다.


예제 코드

using System;
using static System.Console;//Console단어를 생략(코드길이줄어둠)
namespace ConsoleApp1
{
    // ConstEx 클래스의 정의이다.
    class ConstEx  
    {
        // const int number를 선언하고 3을 할당한다. 이후에는 number의 값을 변경할 수 없다.
        public const int number = 3;
    }

    // ReadOnlyEx 클래스의 정의이다.
    class ReadOnlyEx 
    {
        // readonly int number를 선언하고 10으로 할당한다.
        public readonly int number = 10; 

        // 생성자가 2개 중복되어 있다. 
        // 매개변수 없는 ReadOnlyEx() 생성자는 
        public ReadOnlyEx()
        {
            // number값을 20으로 할당한다.
            number = 20;
        }

        // int 매개변수를 갖는 ReadOnlyEx(int n) 생성자는
        public ReadOnlyEx(int n)
        {
            // number값을 n으로 할당한다.
            number = n;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // const를 사용한 number값을 출력한다.
            // ConstEx.number와 같이 "클래스이름.변수명"을 사용한다. 
            // 3이 출력된다.
            WriteLine(ConstEx.number);


            // ReadOnlyEx의 인스턴스 inst1을 생성한다. 
            // new ReadOnlyEx()를 사용하였으므로 
            // 매개변수 없는 ReadOnlyEx() 생성자가 실행되며,
            // number값은 20으로 할당된다.
            ReadOnlyEx inst1 = new ReadOnlyEx(); 


            // inst1.number를 출력하면 20이 출력된다.
            // const와 달리 readonly 변수는 "인스턴스명.변수명"을 사용한다.
            WriteLine(inst1.number);


            // ReadOnlyEx의 인스턴스 inst2을 생성한다. 
            // new ReadOnlyEx(100)를 사용하였으므로 
            // 매개변수로 int를 갖는 ReadOnlyEx(int n) 생성자가 실행되며,
            // number값은 100으로 할당된다.
            ReadOnlyEx inst2 = new ReadOnlyEx(100);


            // inst2.number를 출력하면 100이 출력된다.                    
            WriteLine(inst2.number);
        }
    }
}

결과

3
20
100