2 minute read

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
    }
}


Top