C# Academy · 강의

상수 및 readonly 필드

const와 static readonly의 차이를 구분합니다.

레슨 3/413개 단계

상수 및 readonly 필드은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

값을 고정하는 두 가지 방법

C#에서는 변경되지 않아야 하는 값에 const와 readonly를 제공합니다. 두 키워드는 비슷해 보이지만 동작은 매우 다릅니다. 이 레슨에서는 두 키워드를 비교합니다.

using System;

class Config
{
    public const double Pi = 3.14159;
    public static readonly DateTime StartedAt = DateTime.Now;
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Pi = " + Config.Pi);
    }
}

const: 컴파일 시간 상수

const는 선언할 때 리터럴 값을 할당해야 하며 컴파일 시간에 값이 코드에 고정됩니다. 암시적으로 정적입니다.

using System;

class Circle
{
    public const double Pi = 3.14159;

    public static double Area(double r) => Pi * r * r;
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Circle.Area(2).ToString("0.00"));
    }
}

const는 리터럴이어야 합니다

컴파일 시간에 값이 결정되므로 const에는 숫자, 문자열, 불리언 또는 다른 const와 같은 상수 식만 저장할 수 있습니다.

using System;

class Limits
{
    public const int MaxRetries = 3;
    public const int Timeout = MaxRetries * 1000;   // const expression OK
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Limits.MaxRetries + ", " + Limits.Timeout);
    }
}

readonly: 런타임 상수

readonly 필드는 선언할 때나 생성자에서 한 번 설정한 뒤 변경할 수 없습니다. 값은 런타임에 계산할 수 있습니다.

using System;

class Session
{
    public readonly string Id;

    public Session(string id)
    {
        Id = id;   // allowed: inside constructor
    }
}

class Program
{
    static void Main()
    {
        var s = new Session("abc-123");
        Console.WriteLine("Session: " + s.Id);
    }
}

readonly는 런타임 값을 사용할 수 있습니다

const와 달리 readonly 필드에는 프로그램이 실행될 때에만 알 수 있는 값도 저장할 수 있습니다. 예를 들어 생성된 식별자나 현재 시각을 저장할 수 있습니다.

using System;

class Order
{
    public readonly Guid OrderId;

    public Order()
    {
        OrderId = Guid.NewGuid();
    }
}

class Program
{
    static void Main()
    {
        var o = new Order();
        Console.WriteLine("Has id: " + (o.OrderId != Guid.Empty));
    }
}

static readonly

static readonly를 함께 사용하면 런타임에 한 번 계산되는 클래스 전체의 값을 만들 수 있습니다. 값이 리터럴이 아닐 때 const를 대신하는 일반적인 방법입니다.

using System;

class AppInfo
{
    public static readonly string[] Roles = { "admin", "user", "guest" };
}

class Program
{
    static void Main()
    {
        Console.WriteLine("Roles: " + Roles());
    }

    static int Roles() => AppInfo.Roles.Length;
}

어셈블리 간 const 사용이 위험할 수 있는 이유

const 값은 컴파일 시 호출 코드에 인라인되므로, 라이브러리의 public const를 변경하면 모든 호출자를 다시 컴파일해야 합니다. static readonly를 사용하면 이 문제를 피할 수 있습니다.

using System;

class Lib
{
    public const int Version = 2;              // inlined into callers
    public static readonly int Build = 100;     // read at runtime
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Lib.Version + "." + Lib.Build);
    }
}

어느 쪽도 다시 할당할 수 없습니다

초기화가 끝나면 const 필드와 readonly 필드는 모두 변경할 수 없습니다. 변경을 시도하면 컴파일 오류가 발생합니다.

using System;

class Demo
{
    public const int A = 10;
    public readonly int B;

    public Demo() { B = 20; }
    // A = 11;  // would not compile
    // B = 21;  // would not compile outside constructor
}

class Program
{
    static void Main()
    {
        var d = new Demo();
        Console.WriteLine(Demo.A + ", " + d.B);
    }
}

둘 중 선택하기

절대 변하지 않는 진정한 리터럴(Pi, MaxInt)에는 const를 사용합니다. 값이 실행 시간에 계산되거나 인스턴스마다 달라질 수 있다면 readonly를 사용합니다.

using System;

class Physics
{
    public const double Gravity = 9.81;          // universal literal
    public readonly double Mass;                  // per object

    public Physics(double mass) { Mass = mass; }
    public double Weight() => Mass * Gravity;
}

class Program
{
    static void Main()
    {
        var p = new Physics(10);
        Console.WriteLine("Weight: " + p.Weight());
    }
}

readonly 참조의 주의점

readonly는 필드를 잠글 뿐, 필드가 가리키는 객체까지 잠그지는 않습니다. 읽기 전용 목록 참조에는 다시 할당할 수 없지만, 그 안의 내용은 여전히 변경할 수 있습니다.

using System;
using System.Collections.Generic;

class Cart
{
    public readonly List<string> Items = new List<string>();
}

class Program
{
    static void Main()
    {
        var c = new Cart();
        c.Items.Add("Pen");   // allowed: mutating the object
        c.Items.Add("Book");
        Console.WriteLine("Items: " + c.Items.Count);
    }
}

함께 적용하기

일반적인 클래스에서는 고정된 리터럴에 const를 사용하고, 생성 시 인스턴스마다 고정되는 값에는 readonly를 사용합니다.

using System;

class Account
{
    public const decimal MinBalance = 0m;
    public readonly string Owner;

    public Account(string owner)
    {
        Owner = owner;
    }
}

class Program
{
    static void Main()
    {
        var a = new Account("Rin");
        Console.WriteLine(a.Owner + " min=" + Account.MinBalance);
    }
}

빠른 확인

const와 readonly의 차이에 대한 이해도를 확인해 보세요.

복습

const는 컴파일 시간 리터럴이며 암시적으로 정적이고 호출자에게 인라인됩니다. readonly는 선언 시 또는 생성자에서 한 번 설정되며 실행 시간 값을 사용할 수 있습니다. 진정한 리터럴에는 const를, 실행 시간에 계산되는 공유 값에는 static readonly를 사용하고, readonly는 객체가 아니라 참조를 잠근다는 점을 기억하세요.

using System;

class Demo
{
    public const int Max = 100;
    public readonly int Created;
    public Demo(int c) { Created = c; }
}

class Program
{
    static void Main()
    {
        var d = new Demo(7);
        Console.WriteLine(Demo.Max + ", " + d.Created);
    }
}
무료로 시작

AI 튜터와 함께 C#을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
93
레슨
346

자주 묻는 질문

“상수 및 readonly 필드” 강의는 무료인가요?

네 — “상수 및 readonly 필드” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“상수 및 readonly 필드”에서 뭘 배우나요?

const와 static readonly의 차이를 구분합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“상수 및 readonly 필드” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 정적 메서드와 필드
  2. 유틸리티용 정적 클래스
  3. 상수 및 readonly 필드
  4. 정적 설계와 인스턴스 설계
← C# Academy(으)로 돌아가기