Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 읽기 전용(readonly) 필드와 속성 활용 방법 완벽 가이드

C#에서 readonly 키워드로 선언된 필드는 객체가 생성되는 시점에 단 한 번만 값을 설정할 수 있습니다. 이후에는 프로그램 실행 중에 값을 변경할 수 없으며, 변경을 시도하면 컴파일 오류가 발생합니다.

readonly 필드 기본 예제

다음 예제는 salary 필드를 읽기 전용으로 선언하고 생성자에서 초기화하는 모습을 보여줍니다.

class Employee {
    readonly int salary;

    Employee(int salary) {
        this.salary = salary;
    }

    void UpdateSalary() {
        // salary = 50000; // 컴파일 오류 발생
    }
}

위 코드에서 salary 필드는 readonly로 선언되었으며, 생성자를 통해서만 값이 할당됩니다.

만약 주석 처리된 부분처럼 메서드 내에서 값을 변경하려고 하면 컴파일 타임 오류가 발생합니다. 이것이 바로 읽기 전용 필드의 핵심 특징입니다.

readonly의 주요 특징

  • 선언 시점 또는 생성자 내부에서만 초기화할 수 있습니다.
  • 런타임 중에는 어떤 경우에도 값을 수정할 수 없습니다.
  • 값 타입과 참조 타입 모두에 적용 가능하며, 참조 타입의 경우 참조 자체만 고정됩니다.

배열의 읽기 전용 여부 확인하기

C#에서는 IsReadOnly 속성을 사용하여 배열이나 컬렉션이 읽기 전용인지 확인할 수 있습니다. 다음 예제를 살펴보겠습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lower {
    class Program {
        static void Main(string[] args) {
            Array arr = Array.CreateInstance(typeof(String), 3);
            arr.SetValue("Maths", 0);
            arr.SetValue("Science", 1);
            arr.SetValue("PHP", 2);

            Console.WriteLine("isReadOnly: {0}", arr.IsReadOnly.ToString());
        }
    }
}

코드 설명

  • Array.CreateInstance(typeof(String), 3) — 문자열 타입의 크기 3인 배열을 동적으로 생성합니다.
  • SetValue() 메서드로 각 인덱스에 과목 이름을 저장합니다.
  • IsReadOnly 속성을 출력하여 해당 배열이 읽기 전용인지 여부를 확인합니다.

일반 배열은 기본적으로 읽기 전용이 아니므로 위 코드는 False를 출력합니다. 반면 Array.AsReadOnly() 메서드로 감싼 배열은 True를 반환하여 요소 수정이 차단됩니다.