[C#] C# 에서 사용하는 readonly사용법과 설명 완벽 정리 (C# 예시 코드 포함)
readonly란?
C#에서 readonly 키워드는 필드를 읽기 전용으로 만들어, 선언 시 또는 생성자 내에서만 값을 할당할 수 있도록 합니다. 이는 값이 변경되지 않아야 하는 상황에서 유용하게 사용됩니다. readonly와 비슷한 const 키워드도 있지만, const는 컴파일 타임에 값이 결정되어야 하는 반면, readonly는 런타임에 값을 할당할 수 있다는 차이점이 있습니다.
readonly는 모든 자료형에 사용 할 수 있으며, 런타임에 이루어지므로 반드시 생성과 동시에 초기화 할 필요는 없습니다.
단, 생성자 단계에서 단 1번 할당을 통해 초기화 할 수 있습니다.
const와 차이점은?
컴파일 시 아니면 런타임 시 정수로 취급되는가, 유연성, 사용가능한 곳 등의 차이가 있지만, 어느쪽이든 나중에 값을 변경할 수 없다 라는 공통점이 있습니다.
- const는 컴파일 타임 상수인 반면, readonly는 런타임 상수입니다. 즉, readonly 필드는 선언 시 또는 생성자에서 초기화할 수 있습니다.
- const는 암시적으로 static이지만, readonly는 인스턴스별로 다를 수 있습니다.
어느쪽이든 나중에 값을 변경할 수 없고 compile중에 처리되는 const와 같은 성능 상 이점이 없는데 readonly를 사용하는 이유는?
=> 생성자 안에서 변수값을 바꾸는 등 상황에 따라 다르다고 할 수 있습니다.
예를 들어 풀 스크린 UI앱의 경우 기기의 디스플레이 해상도에 따라 화면 구성 요소의 크기가 달라질 수 있으며, 이때 앱은 런타임 중 최초 한번에 한해 해상도를 확정하고 그에 맞게 내부 UI의 크기와 배치 등을 설정하는데 이렇게 확정된 값은 프로세스가 종료되기 전 까지 계속 사용할 수 있습니다.
유니티에서도 당연히readonly를 사용할 수 있으며 해당 포스팅은 아래와 같습니다.
Unity에서 readonly
예제
[선언과 동시에 readonly를 이용해 초기화]
public class MyClass
{
public readonly int myNumber = 10; // 선언과 동시에 초기화
public void PrintNumber()
{
Console.WriteLine(myNumber); // 출력: 10
}
}
[생성자에서 readonly를 이용해 초기화]
public class MyClass
{
public readonly string myString;
public MyClass(string str)
{
this.myString = str; // 생성자에서 초기화
}
public void PrintString()
{
Console.WriteLine(myString);
}
}
// 사용 예시
MyClass obj = new MyClass("Hello, world!");
obj.PrintString(); // 출력: Hello, world!
[정적 readonly 필드]
public class MyClass
{
public static readonly DateTime startTime = DateTime.Now;
public static void PrintStartTime()
{
Console.WriteLine(startTime); // 프로그램 시작 시점의 시간 출력
}
}
[struct에서의 readonly]
public struct MyStruct
{
public readonly int x;
public readonly int y;
public MyStruct(int x, int y)
{
this.x = x;
this.y = y;
}
public void PrintCoordinates()
{
Console.WriteLine($"x: {x}, y: {y}");
}
}
[const 기본 사용법]
public class Example
{
public const int MaxUsers = 100; // 정수형 상수
public const double Pi = 3.141592; // 실수형 상수
public const string Message = "Hello, world!"; // 문자열 상수
public const bool IsEnabled = true; // 부울형 상수
}
[클래스 내에서 const사용]
public class Circle
{
public const double Pi = 3.141592;
public double GetArea(double radius)
{
return Pi * radius * radius;
}
}
public class Program
{
public static void Main(string[] args)
{
double area = new Circle().GetArea(5);
Console.WriteLine(area); // 출력: 78.5398
Console.WriteLine(Circle.Pi); // 출력: 3.141592
}
}