상수 및 readonly 필드
const와 static readonly의 차이를 구분합니다.
상수 및 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 정적 메서드와 필드
- 유틸리티용 정적 클래스
- 상수 및 readonly 필드
- 정적 설계와 인스턴스 설계